use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OidcProviderMetadata {
pub issuer: String,
pub authorization_endpoint: String,
pub token_endpoint: String,
pub jwks_uri: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub userinfo_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_session_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub registration_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_types_supported: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grant_types_supported: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scopes_supported: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_endpoint_auth_methods_supported: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_token_signing_alg_values_supported: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_challenge_methods_supported: Option<Vec<String>>,
#[serde(default = "default_subject_types_supported")]
pub subject_types_supported: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub introspection_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub revocation_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub frontchannel_logout_supported: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub frontchannel_logout_session_supported: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backchannel_logout_supported: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backchannel_logout_session_supported: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tenant_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tenant_slug: Option<String>,
}
fn default_subject_types_supported() -> Vec<String> {
vec!["public".to_string()]
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenResponse {
pub access_token: String,
pub token_type: String,
pub expires_in: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub refresh_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_token: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerifiedIdToken {
pub iss: String,
pub sub: String,
pub aud: String,
pub exp: i64,
pub iat: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub nonce: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub picture: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amr: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub xjp_admin: Option<bool>,
}
#[derive(Debug, Clone)]
pub struct AuthUrlResult {
pub url: url::Url,
pub state: String,
pub nonce: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct BuildAuthUrl {
pub issuer: String,
pub client_id: String,
pub redirect_uri: String,
pub scope: String,
pub state: Option<String>,
pub nonce: Option<String>,
pub prompt: Option<String>,
pub code_challenge: String,
pub extra_params: Option<HashMap<String, String>>,
pub tenant: Option<String>,
#[cfg_attr(not(feature = "verifier"), serde(skip_serializing_if = "Option::is_none"))]
pub authorization_endpoint: Option<String>,
}
#[derive(Debug, Clone)]
pub struct ExchangeCode {
pub issuer: String,
pub client_id: String,
pub code: String,
pub redirect_uri: String,
pub code_verifier: Option<String>,
pub client_secret: Option<String>,
pub token_endpoint_auth_method: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct EndSession {
pub issuer: String,
pub id_token_hint: String,
pub post_logout_redirect_uri: Option<String>,
pub state: Option<String>,
pub end_session_endpoint: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallbackParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub application_type: Option<String>,
pub redirect_uris: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_logout_redirect_uris: Option<Vec<String>>,
pub grant_types: Vec<String>,
pub token_endpoint_auth_method: String,
pub scope: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub contacts: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub software_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientRegistrationResult {
pub client_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_secret: Option<String>,
pub status: ClientStatus,
pub client_name: String,
pub redirect_uris: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_logout_redirect_uris: Option<Vec<String>>,
pub grant_types: Vec<String>,
pub token_endpoint_auth_method: String,
pub scope: String,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ClientStatus {
Active,
Pending,
Suspended,
}
#[cfg(feature = "verifier")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerifiedClaims {
pub iss: String,
pub sub: String,
pub aud: String,
pub exp: i64,
pub iat: i64,
pub jti: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub xjp_admin: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amr: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_time: Option<i64>,
}
#[derive(Clone)]
pub struct VerifyOptions<'a> {
pub issuer: &'a str,
pub audience: &'a str,
pub nonce: Option<&'a str>,
pub max_age_sec: Option<i64>,
pub clock_skew_sec: Option<i64>,
pub http: &'a dyn crate::http::HttpClient,
pub cache: &'a dyn crate::cache::Cache<String, crate::jwks::Jwks>,
}
impl Default for VerifyOptions<'_> {
fn default() -> Self {
panic!("VerifyOptions requires explicit construction with required fields")
}
}
#[derive(Debug, Clone)]
pub struct IntrospectRequest {
pub issuer: String,
pub client_id: String,
pub client_secret: Option<String>,
pub token: String,
pub token_type_hint: Option<String>,
pub token_endpoint_auth_method: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntrospectResponse {
pub active: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exp: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iat: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nbf: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sub: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub aud: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iss: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub jti: Option<String>,
}
#[derive(Debug, Clone)]
pub struct RefreshTokenRequest {
pub issuer: String,
pub client_id: String,
pub client_secret: Option<String>,
pub refresh_token: String,
pub scope: Option<String>,
pub token_endpoint_auth_method: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserInfo {
pub sub: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub given_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub family_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub middle_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub preferred_username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub profile: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub picture: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub website: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email_verified: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gender: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub birthdate: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub zoneinfo: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone_number_verified: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub xjp_admin: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amr: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auth_time: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientConfig {
pub client_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_secret: Option<String>,
pub client_name: String,
pub redirect_uris: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_logout_redirect_uris: Option<Vec<String>>,
pub grant_types: Vec<String>,
pub response_types: Vec<String>,
pub token_endpoint_auth_method: String,
pub scope: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_secret_expires_at: Option<i64>,
}