use crate::oauth::pkce::CodeChallengeMethod; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] pub struct Claims { pub sub: String, pub iss: String, pub aud: String, pub exp: u64, pub iat: u64, #[serde(skip_serializing_if = "Option::is_none")] pub scope: Option, #[serde(skip_serializing_if = "Option::is_none")] pub jti: Option, // JWT ID for token tracking } #[derive(Debug, Serialize, Deserialize)] pub struct TokenResponse { pub access_token: String, pub token_type: String, pub expires_in: u64, #[serde(skip_serializing_if = "Option::is_none")] pub refresh_token: Option, #[serde(skip_serializing_if = "Option::is_none")] pub scope: Option, } #[derive(Debug, Serialize, Deserialize)] pub struct ErrorResponse { pub error: String, #[serde(skip_serializing_if = "Option::is_none")] pub error_description: Option, #[serde(skip_serializing_if = "Option::is_none")] pub error_uri: Option, } #[derive(Debug, Clone)] pub struct AuthCode { pub client_id: String, pub redirect_uri: String, pub scope: Option, pub expires_at: u64, pub user_id: String, // PKCE support pub code_challenge: Option, pub code_challenge_method: Option, } #[derive(Debug, Serialize, Deserialize)] pub struct TokenIntrospectionRequest { pub token: String, #[serde(skip_serializing_if = "Option::is_none")] pub token_type_hint: Option, } #[derive(Debug, Serialize, Deserialize)] pub struct TokenIntrospectionResponse { pub active: bool, #[serde(skip_serializing_if = "Option::is_none")] pub client_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub username: Option, #[serde(skip_serializing_if = "Option::is_none")] pub scope: Option, #[serde(skip_serializing_if = "Option::is_none")] pub exp: Option, #[serde(skip_serializing_if = "Option::is_none")] pub iat: Option, #[serde(skip_serializing_if = "Option::is_none")] pub sub: Option, #[serde(skip_serializing_if = "Option::is_none")] pub aud: Option, #[serde(skip_serializing_if = "Option::is_none")] pub iss: Option, #[serde(skip_serializing_if = "Option::is_none")] pub jti: Option, } impl TokenIntrospectionResponse { pub fn inactive() -> Self { Self { active: false, client_id: None, username: None, scope: None, exp: None, iat: None, sub: None, aud: None, iss: None, jti: None, } } } #[derive(Debug, Serialize, Deserialize)] pub struct TokenRevocationRequest { pub token: String, #[serde(skip_serializing_if = "Option::is_none")] pub token_type_hint: Option, }