yup_oauth2/
authorized_user.rs1use crate::client::SendRequest;
8use crate::error::Error;
9use crate::types::TokenInfo;
10use http::header;
11use http_body_util::BodyExt;
12use serde::{Deserialize, Serialize};
13
14use url::form_urlencoded;
15
16const TOKEN_URI: &str = "https://accounts.google.com/o/oauth2/token";
17
18#[derive(Serialize, Deserialize, Debug, Clone)]
24pub struct AuthorizedUserSecret {
25 pub client_id: String,
27 pub client_secret: String,
29 pub refresh_token: String,
31 #[serde(rename = "type")]
32 pub key_type: String,
34}
35
36pub struct AuthorizedUserFlow {
38 pub(crate) secret: AuthorizedUserSecret,
39}
40
41impl AuthorizedUserFlow {
42 pub(crate) async fn token<T>(
44 &self,
45 hyper_client: &impl SendRequest,
46 _scopes: &[T],
47 ) -> Result<TokenInfo, Error>
48 where
49 T: AsRef<str>,
50 {
51 let req = form_urlencoded::Serializer::new(String::new())
52 .extend_pairs(&[
53 ("client_id", self.secret.client_id.as_str()),
54 ("client_secret", self.secret.client_secret.as_str()),
55 ("refresh_token", self.secret.refresh_token.as_str()),
56 ("grant_type", "refresh_token"),
57 ])
58 .finish();
59
60 let request = http::Request::post(TOKEN_URI)
61 .header(header::CONTENT_TYPE, "application/x-www-form-urlencoded")
62 .body(req)
63 .unwrap();
64
65 log::debug!("requesting token from authorized user: {:?}", request);
66 let (head, body) = hyper_client.request(request).await?.into_parts();
67 let body = body.collect().await?.to_bytes();
68 log::debug!("received response; head: {:?}, body: {:?}", head, body);
69 TokenInfo::from_json(&body)
70 }
71}