/ backend / src / api / openid / configuration.rs
configuration.rs
 1  use rocket::serde::json::Json;
 2  use rocket::State;
 3  use serde::{Deserialize, Serialize};
 4  
 5  use crate::api::common::headers::{AccessControlAllowOrigin, AccessControlAllowOriginVariant};
 6  use crate::{models::oauth_scope::OauthScope, util::config::Config};
 7  
 8  #[derive(Debug, Clone, Serialize, Deserialize)]
 9  pub struct OpenIdConfiguration {
10      issuer: String,
11      authorization_endpoint: String,
12      token_endpoint: String,
13      userinfo_endpoint: String,
14      jwks_uri: String,
15      scopes_supported: Vec<String>,
16      response_types_supported: Vec<String>,
17      grant_types_supported: Vec<String>,
18      subject_types_supported: Vec<String>,
19      id_token_signing_alg_values_supported: Vec<String>,
20      claims_supported: Vec<String>,
21  }
22  
23  #[derive(Responder, Debug)]
24  pub enum OpenIdConfigurationResponse {
25      Success {
26          inner: Json<OpenIdConfiguration>,
27          access_control_allow_origin: AccessControlAllowOrigin,
28      },
29  }
30  
31  #[get("/.well-known/openid-configuration")]
32  pub async fn get_openid_configuration(config: &State<Config>) -> OpenIdConfigurationResponse {
33      // TODO: Double check these values (especially where we might support more than is currently listewhere we might support more than is currently listed).
34      OpenIdConfigurationResponse::Success {
35          inner: Json(OpenIdConfiguration {
36              issuer: config.backend_address.clone(),
37              authorization_endpoint: format!("{}/api/oauth/authorize", config.backend_address),
38              token_endpoint: format!("{}/api/oauth/token", config.backend_address),
39              userinfo_endpoint: format!("{}/api/openid/userinfo", config.backend_address),
40              jwks_uri: format!("{}/api/openid/certs", config.backend_address),
41              scopes_supported: vec![OauthScope::OpenId, OauthScope::Profile, OauthScope::Email]
42                  .into_iter()
43                  .map(|s| s.to_string())
44                  .collect(),
45              response_types_supported: vec!["code".into()],
46              grant_types_supported: vec!["authorization_code".into()],
47              subject_types_supported: vec!["public".into()],
48              id_token_signing_alg_values_supported: vec![], // TODO: Not implemented
49              claims_supported: vec![
50                  "iss",
51                  "sub",
52                  "aud",
53                  "exp",
54                  "iat",
55                  "email",
56                  "email_verified",
57                  "name",
58                  "given_name",
59                  "family_name",
60              ]
61              .into_iter()
62              .map(|s| s.to_string())
63              .collect(),
64          }),
65          access_control_allow_origin: AccessControlAllowOriginVariant::Any.into(),
66      }
67  }