this repo has no description
1use chrono::{DateTime, Utc}; 2use serde::{Deserialize, Serialize}; 3use serde_json::Value as JsonValue; 4 5#[derive(Debug, Clone, Serialize, Deserialize)] 6pub struct RequestId(pub String); 7 8#[derive(Debug, Clone, Serialize, Deserialize)] 9pub struct TokenId(pub String); 10 11#[derive(Debug, Clone, Serialize, Deserialize)] 12pub struct DeviceId(pub String); 13 14#[derive(Debug, Clone, Serialize, Deserialize)] 15pub struct SessionId(pub String); 16 17#[derive(Debug, Clone, Serialize, Deserialize)] 18pub struct Code(pub String); 19 20#[derive(Debug, Clone, Serialize, Deserialize)] 21pub struct RefreshToken(pub String); 22 23impl RequestId { 24 pub fn generate() -> Self { 25 Self(format!("urn:ietf:params:oauth:request_uri:{}", uuid::Uuid::new_v4())) 26 } 27} 28 29impl TokenId { 30 pub fn generate() -> Self { 31 Self(uuid::Uuid::new_v4().to_string()) 32 } 33} 34 35impl DeviceId { 36 pub fn generate() -> Self { 37 Self(uuid::Uuid::new_v4().to_string()) 38 } 39} 40 41impl SessionId { 42 pub fn generate() -> Self { 43 Self(uuid::Uuid::new_v4().to_string()) 44 } 45} 46 47impl Code { 48 pub fn generate() -> Self { 49 use rand::Rng; 50 let bytes: [u8; 32] = rand::thread_rng().r#gen(); 51 Self(base64::Engine::encode( 52 &base64::engine::general_purpose::URL_SAFE_NO_PAD, 53 bytes, 54 )) 55 } 56} 57 58impl RefreshToken { 59 pub fn generate() -> Self { 60 use rand::Rng; 61 let bytes: [u8; 32] = rand::thread_rng().r#gen(); 62 Self(base64::Engine::encode( 63 &base64::engine::general_purpose::URL_SAFE_NO_PAD, 64 bytes, 65 )) 66 } 67} 68 69#[derive(Debug, Clone, Serialize, Deserialize)] 70#[serde(tag = "method")] 71pub enum ClientAuth { 72 #[serde(rename = "none")] 73 None, 74 #[serde(rename = "client_secret_basic")] 75 SecretBasic { client_secret: String }, 76 #[serde(rename = "client_secret_post")] 77 SecretPost { client_secret: String }, 78 #[serde(rename = "private_key_jwt")] 79 PrivateKeyJwt { client_assertion: String }, 80} 81 82#[derive(Debug, Clone, Serialize, Deserialize)] 83pub struct AuthorizationRequestParameters { 84 pub response_type: String, 85 pub client_id: String, 86 pub redirect_uri: String, 87 pub scope: Option<String>, 88 pub state: Option<String>, 89 pub code_challenge: String, 90 pub code_challenge_method: String, 91 pub login_hint: Option<String>, 92 pub dpop_jkt: Option<String>, 93 #[serde(flatten)] 94 pub extra: Option<JsonValue>, 95} 96 97#[derive(Debug, Clone)] 98pub struct RequestData { 99 pub client_id: String, 100 pub client_auth: Option<ClientAuth>, 101 pub parameters: AuthorizationRequestParameters, 102 pub expires_at: DateTime<Utc>, 103 pub did: Option<String>, 104 pub device_id: Option<String>, 105 pub code: Option<String>, 106} 107 108#[derive(Debug, Clone)] 109pub struct DeviceData { 110 pub session_id: String, 111 pub user_agent: Option<String>, 112 pub ip_address: String, 113 pub last_seen_at: DateTime<Utc>, 114} 115 116#[derive(Debug, Clone)] 117pub struct TokenData { 118 pub did: String, 119 pub token_id: String, 120 pub created_at: DateTime<Utc>, 121 pub updated_at: DateTime<Utc>, 122 pub expires_at: DateTime<Utc>, 123 pub client_id: String, 124 pub client_auth: ClientAuth, 125 pub device_id: Option<String>, 126 pub parameters: AuthorizationRequestParameters, 127 pub details: Option<JsonValue>, 128 pub code: Option<String>, 129 pub current_refresh_token: Option<String>, 130 pub scope: Option<String>, 131} 132 133#[derive(Debug, Clone, Serialize, Deserialize)] 134pub struct AuthorizedClientData { 135 pub scope: Option<String>, 136 pub remember: bool, 137} 138 139#[derive(Debug, Clone, Serialize, Deserialize)] 140pub struct OAuthClientMetadata { 141 pub client_id: String, 142 pub client_name: Option<String>, 143 pub client_uri: Option<String>, 144 pub logo_uri: Option<String>, 145 pub redirect_uris: Vec<String>, 146 pub grant_types: Option<Vec<String>>, 147 pub response_types: Option<Vec<String>>, 148 pub scope: Option<String>, 149 pub token_endpoint_auth_method: Option<String>, 150 pub dpop_bound_access_tokens: Option<bool>, 151 pub jwks: Option<JsonValue>, 152 pub jwks_uri: Option<String>, 153 pub application_type: Option<String>, 154} 155 156#[derive(Debug, Clone, Serialize, Deserialize)] 157pub struct ProtectedResourceMetadata { 158 pub resource: String, 159 pub authorization_servers: Vec<String>, 160 pub bearer_methods_supported: Vec<String>, 161 pub scopes_supported: Vec<String>, 162 pub resource_documentation: Option<String>, 163} 164 165#[derive(Debug, Clone, Serialize, Deserialize)] 166pub struct AuthorizationServerMetadata { 167 pub issuer: String, 168 pub authorization_endpoint: String, 169 pub token_endpoint: String, 170 pub jwks_uri: String, 171 pub registration_endpoint: Option<String>, 172 pub scopes_supported: Option<Vec<String>>, 173 pub response_types_supported: Vec<String>, 174 pub response_modes_supported: Option<Vec<String>>, 175 pub grant_types_supported: Option<Vec<String>>, 176 pub token_endpoint_auth_methods_supported: Option<Vec<String>>, 177 pub code_challenge_methods_supported: Option<Vec<String>>, 178 pub pushed_authorization_request_endpoint: Option<String>, 179 pub require_pushed_authorization_requests: Option<bool>, 180 pub dpop_signing_alg_values_supported: Option<Vec<String>>, 181 pub authorization_response_iss_parameter_supported: Option<bool>, 182} 183 184#[derive(Debug, Clone, Serialize, Deserialize)] 185pub struct ParResponse { 186 pub request_uri: String, 187 pub expires_in: u64, 188} 189 190#[derive(Debug, Clone, Serialize, Deserialize)] 191pub struct TokenResponse { 192 pub access_token: String, 193 pub token_type: String, 194 pub expires_in: u64, 195 #[serde(skip_serializing_if = "Option::is_none")] 196 pub refresh_token: Option<String>, 197 #[serde(skip_serializing_if = "Option::is_none")] 198 pub scope: Option<String>, 199 #[serde(skip_serializing_if = "Option::is_none")] 200 pub sub: Option<String>, 201} 202 203#[derive(Debug, Clone, Serialize, Deserialize)] 204pub struct TokenRequest { 205 pub grant_type: String, 206 pub code: Option<String>, 207 pub redirect_uri: Option<String>, 208 pub code_verifier: Option<String>, 209 pub refresh_token: Option<String>, 210 pub client_id: Option<String>, 211 pub client_secret: Option<String>, 212} 213 214#[derive(Debug, Clone, Serialize, Deserialize)] 215pub struct DPoPClaims { 216 pub jti: String, 217 pub htm: String, 218 pub htu: String, 219 pub iat: i64, 220 #[serde(skip_serializing_if = "Option::is_none")] 221 pub ath: Option<String>, 222 #[serde(skip_serializing_if = "Option::is_none")] 223 pub nonce: Option<String>, 224} 225 226#[derive(Debug, Clone, Serialize, Deserialize)] 227pub struct JwkPublicKey { 228 pub kty: String, 229 pub crv: Option<String>, 230 pub x: Option<String>, 231 pub y: Option<String>, 232 #[serde(rename = "use")] 233 pub key_use: Option<String>, 234 pub kid: Option<String>, 235 pub alg: Option<String>, 236} 237 238#[derive(Debug, Clone, Serialize, Deserialize)] 239pub struct Jwks { 240 pub keys: Vec<JwkPublicKey>, 241}