box_open_sdk/managers/
authorization.rs1use crate::runtime::{self, Error};
4
5#[derive(Clone, Debug, Default)]
7pub struct AuthorizationAuthorizeOptions {
8 pub redirect_uri: Option<String>,
9 pub state: Option<String>,
10 pub scope: Option<String>,
11}
12
13pub struct AuthorizationManager {
15 session: std::sync::Arc<runtime::Client>,
16}
17
18impl AuthorizationManager {
19 pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
20 Self { session }
21 }
22
23 pub async fn authorize(
24 &self,
25 response_type: crate::models::schemas::GetAuthorizeResponseType,
26 client_id: String,
27 opts: Option<AuthorizationAuthorizeOptions>,
28 ) -> Result<String, Error> {
29 let mut url = self.session.base_url("oauth_authorize");
30 url.push_str("/authorize");
31 let mut req = self.session.new_request("GET", &url);
32 req = runtime::with_query(req, "response_type", &response_type.0);
33 req = runtime::with_query(req, "client_id", &client_id);
34 let opts = opts.unwrap_or_default();
35 if let Some(value) = opts.redirect_uri {
36 req = runtime::with_query(req, "redirect_uri", &value);
37 }
38 if let Some(value) = opts.state {
39 req = runtime::with_query(req, "state", &value);
40 }
41 if let Some(value) = opts.scope {
42 req = runtime::with_query(req, "scope", &value);
43 }
44 let resp = self.session.fetch(req).await?;
45 let data = runtime::response_bytes(&resp)?;
46 Ok(String::from_utf8_lossy(&data).into_owned())
47 }
48
49 pub async fn create_oauth2_token(
50 &self,
51 body: crate::models::schemas::PostOAuth2Token,
52 ) -> Result<crate::models::schemas::AccessToken, Error> {
53 let mut url = self.session.base_url("api_root");
54 url.push_str("/oauth2");
55 url.push_str("/token");
56 let mut req = self.session.new_request("POST", &url);
57 let mut form: Vec<(&str, String)> = vec![("grant_type", body.grant_type.0.clone())];
58 if let Some(value) = &body.client_id {
59 form.push(("client_id", value.clone()));
60 }
61 if let Some(value) = &body.client_secret {
62 form.push(("client_secret", value.clone()));
63 }
64 if let Some(value) = &body.code {
65 form.push(("code", value.clone()));
66 }
67 if let Some(value) = &body.refresh_token {
68 form.push(("refresh_token", value.clone()));
69 }
70 if let Some(value) = &body.assertion {
71 form.push(("assertion", value.clone()));
72 }
73 if let Some(value) = &body.subject_token {
74 form.push(("subject_token", value.clone()));
75 }
76 if let Some(value) = &body.subject_token_type {
77 form.push(("subject_token_type", value.0.clone()));
78 }
79 if let Some(value) = &body.actor_token {
80 form.push(("actor_token", value.clone()));
81 }
82 if let Some(value) = &body.actor_token_type {
83 form.push(("actor_token_type", value.0.clone()));
84 }
85 if let Some(value) = &body.scope {
86 form.push(("scope", value.clone()));
87 }
88 if let Some(value) = &body.resource {
89 form.push(("resource", value.clone()));
90 }
91 if let Some(value) = &body.box_subject_type {
92 form.push(("box_subject_type", value.0.clone()));
93 }
94 if let Some(value) = &body.box_subject_id {
95 form.push(("box_subject_id", value.clone()));
96 }
97 if let Some(value) = &body.box_shared_link {
98 form.push(("box_shared_link", value.clone()));
99 }
100 let payload = crate::internal::form_encode(&form);
101 req = runtime::with_form_body(req, payload.as_bytes());
102 let resp = self.session.fetch(req).await?;
103 let data = runtime::response_bytes(&resp)?;
104 Ok(serde_json::from_slice(&data)?)
105 }
106
107 pub async fn create_oauth2_token_refresh(
108 &self,
109 body: crate::models::schemas::PostOAuth2TokenRefreshAccessToken,
110 ) -> Result<crate::models::schemas::AccessToken, Error> {
111 let mut url = self.session.base_url("api_root");
112 url.push_str("/oauth2");
113 url.push_str("/token");
114 let mut req = self.session.new_request("POST", &url);
115 let form: Vec<(&str, String)> = vec![
116 ("grant_type", body.grant_type.0.clone()),
117 ("client_id", body.client_id.clone()),
118 ("client_secret", body.client_secret.clone()),
119 ("refresh_token", body.refresh_token.clone()),
120 ];
121 let payload = crate::internal::form_encode(&form);
122 req = runtime::with_form_body(req, payload.as_bytes());
123 let resp = self.session.fetch(req).await?;
124 let data = runtime::response_bytes(&resp)?;
125 Ok(serde_json::from_slice(&data)?)
126 }
127
128 pub async fn revoke_oauth2(
129 &self,
130 body: crate::models::schemas::PostOAuth2Revoke,
131 ) -> Result<(), Error> {
132 let mut url = self.session.base_url("api_root");
133 url.push_str("/oauth2");
134 url.push_str("/revoke");
135 let mut req = self.session.new_request("POST", &url);
136 let mut form: Vec<(&str, String)> = Vec::new();
137 if let Some(value) = &body.client_id {
138 form.push(("client_id", value.clone()));
139 }
140 if let Some(value) = &body.client_secret {
141 form.push(("client_secret", value.clone()));
142 }
143 if let Some(value) = &body.token {
144 form.push(("token", value.clone()));
145 }
146 let payload = crate::internal::form_encode(&form);
147 req = runtime::with_form_body(req, payload.as_bytes());
148 let _ = self.session.fetch(req).await?;
149 Ok(())
150 }
151}