oauth2_google/
jwt_authorization_grant.rs1use 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 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}