oauth2_google/
jwt_authorization_grant.rs

1use oauth2_client::{
2    re_exports::{ClientId, ClientSecret, Url, UrlParseError},
3    Provider, ProviderExtJwtAuthorizationGrant,
4};
5
6use crate::{GoogleScope, TOKEN_URL};
7
8#[derive(Debug, Clone)]
9pub struct GoogleProviderForServerToServerApps {
10    assertion: String,
11    //
12    token_endpoint_url: Url,
13}
14impl GoogleProviderForServerToServerApps {
15    pub fn new(assertion: String) -> Result<Self, UrlParseError> {
16        Ok(Self {
17            assertion,
18            token_endpoint_url: TOKEN_URL.parse()?,
19        })
20    }
21}
22impl Provider for GoogleProviderForServerToServerApps {
23    type Scope = GoogleScope;
24
25    fn client_id(&self) -> Option<&ClientId> {
26        None
27    }
28
29    fn client_secret(&self) -> Option<&ClientSecret> {
30        None
31    }
32
33    fn token_endpoint_url(&self) -> &Url {
34        &self.token_endpoint_url
35    }
36}
37impl ProviderExtJwtAuthorizationGrant for GoogleProviderForServerToServerApps {
38    fn assertion(&self) -> &str {
39        &self.assertion
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    use oauth2_client::{jwt_authorization_grant::AccessTokenEndpoint, re_exports::Endpoint as _};
48
49    #[test]
50    fn access_token_request() -> Result<(), Box<dyn std::error::Error>> {
51        let provider = GoogleProviderForServerToServerApps::new("ASSERTION".to_owned())?;
52
53        let endpoint = AccessTokenEndpoint::new(&provider, None);
54
55        let request = endpoint.render_request()?;
56
57        assert_eq!(
58            request.body(),
59            b"grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=ASSERTION"
60        );
61
62        Ok(())
63    }
64}