1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct OidcProviderMetadata {
9 pub issuer: String,
11 pub authorization_endpoint: String,
13 pub token_endpoint: String,
15 pub jwks_uri: String,
17 #[serde(skip_serializing_if = "Option::is_none")]
19 pub userinfo_endpoint: Option<String>,
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub end_session_endpoint: Option<String>,
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub registration_endpoint: Option<String>,
26 #[serde(skip_serializing_if = "Option::is_none")]
28 pub response_types_supported: Option<Vec<String>>,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub grant_types_supported: Option<Vec<String>>,
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub scopes_supported: Option<Vec<String>>,
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub token_endpoint_auth_methods_supported: Option<Vec<String>>,
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub id_token_signing_alg_values_supported: Option<Vec<String>>,
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub code_challenge_methods_supported: Option<Vec<String>>,
44 #[serde(default = "default_subject_types_supported")]
46 pub subject_types_supported: Vec<String>,
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub introspection_endpoint: Option<String>,
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub revocation_endpoint: Option<String>,
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub frontchannel_logout_supported: Option<bool>,
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub frontchannel_logout_session_supported: Option<bool>,
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub backchannel_logout_supported: Option<bool>,
62 #[serde(skip_serializing_if = "Option::is_none")]
64 pub backchannel_logout_session_supported: Option<bool>,
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub tenant_id: Option<i64>,
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub tenant_slug: Option<String>,
71}
72
73fn default_subject_types_supported() -> Vec<String> {
75 vec!["public".to_string()]
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct TokenResponse {
81 pub access_token: String,
83 pub token_type: String,
85 pub expires_in: i64,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub refresh_token: Option<String>,
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub scope: Option<String>,
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub id_token: Option<String>,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct VerifiedIdToken {
101 pub iss: String,
104 pub sub: String,
106 pub aud: String,
108 pub exp: i64,
110 pub iat: i64,
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub nonce: Option<String>,
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub sid: Option<String>,
118
119 #[serde(skip_serializing_if = "Option::is_none")]
122 pub name: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub email: Option<String>,
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub picture: Option<String>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
133 pub amr: Option<Vec<String>>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub auth_time: Option<i64>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub xjp_admin: Option<bool>,
140}
141
142#[derive(Debug, Clone)]
144pub struct AuthUrlResult {
145 pub url: url::Url,
147 pub state: String,
149 pub nonce: Option<String>,
151}
152
153#[derive(Debug, Clone, Default)]
155pub struct BuildAuthUrl {
156 pub issuer: String,
158 pub client_id: String,
160 pub redirect_uri: String,
162 pub scope: String,
164 pub state: Option<String>,
166 pub nonce: Option<String>,
168 pub prompt: Option<String>,
170 pub code_challenge: String,
172 pub extra_params: Option<HashMap<String, String>>,
174 pub tenant: Option<String>,
176 #[cfg_attr(not(feature = "verifier"), serde(skip_serializing_if = "Option::is_none"))]
178 pub authorization_endpoint: Option<String>,
179}
180
181#[derive(Debug, Clone)]
183pub struct ExchangeCode {
184 pub issuer: String,
186 pub client_id: String,
188 pub code: String,
190 pub redirect_uri: String,
192 pub code_verifier: Option<String>,
194 pub client_secret: Option<String>,
196 pub token_endpoint_auth_method: Option<String>,
199}
200
201#[derive(Debug, Clone, Default)]
203pub struct EndSession {
204 pub issuer: String,
206 pub id_token_hint: String,
208 pub post_logout_redirect_uri: Option<String>,
210 pub state: Option<String>,
212 pub end_session_endpoint: Option<String>,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
219pub struct CallbackParams {
220 #[serde(skip_serializing_if = "Option::is_none")]
222 pub code: Option<String>,
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub state: Option<String>,
226 #[serde(skip_serializing_if = "Option::is_none")]
228 pub error: Option<String>,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub error_description: Option<String>,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize)]
236pub struct RegisterRequest {
237 #[serde(skip_serializing_if = "Option::is_none")]
239 pub application_type: Option<String>,
240 pub redirect_uris: Vec<String>,
242 #[serde(skip_serializing_if = "Option::is_none")]
244 pub post_logout_redirect_uris: Option<Vec<String>>,
245 pub grant_types: Vec<String>,
247 pub token_endpoint_auth_method: String,
249 pub scope: String,
251 #[serde(skip_serializing_if = "Option::is_none")]
253 pub contacts: Option<Vec<String>>,
254 #[serde(skip_serializing_if = "Option::is_none")]
256 pub software_id: Option<String>,
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub client_name: Option<String>,
260}
261
262#[derive(Debug, Clone, Serialize, Deserialize)]
264pub struct ClientRegistrationResult {
265 pub client_id: String,
267 #[serde(skip_serializing_if = "Option::is_none")]
269 pub client_secret: Option<String>,
270 pub status: ClientStatus,
272 pub client_name: String,
274 pub redirect_uris: Vec<String>,
276 #[serde(skip_serializing_if = "Option::is_none")]
278 pub post_logout_redirect_uris: Option<Vec<String>>,
279 pub grant_types: Vec<String>,
281 pub token_endpoint_auth_method: String,
283 pub scope: String,
285}
286
287#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
289#[serde(rename_all = "lowercase")]
290pub enum ClientStatus {
291 Active,
293 Pending,
295 Suspended,
297}
298
299#[cfg(feature = "verifier")]
301#[derive(Debug, Clone, Serialize, Deserialize)]
302pub struct VerifiedClaims {
303 pub iss: String,
305 pub sub: String,
307 pub aud: String,
309 pub exp: i64,
311 pub iat: i64,
313 pub jti: String,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub scope: Option<String>,
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub xjp_admin: Option<bool>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub amr: Option<Vec<String>>,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub auth_time: Option<i64>,
327}
328
329#[derive(Clone)]
331pub struct VerifyOptions<'a> {
332 pub issuer: &'a str,
334 pub audience: &'a str,
336 pub nonce: Option<&'a str>,
338 pub max_age_sec: Option<i64>,
340 pub clock_skew_sec: Option<i64>,
342 pub http: &'a dyn crate::http::HttpClient,
344 pub cache: &'a dyn crate::cache::Cache<String, crate::jwks::Jwks>,
346}
347
348impl Default for VerifyOptions<'_> {
349 fn default() -> Self {
350 panic!("VerifyOptions requires explicit construction with required fields")
351 }
352}
353
354#[derive(Debug, Clone)]
356pub struct IntrospectRequest {
357 pub issuer: String,
359 pub client_id: String,
361 pub client_secret: Option<String>,
363 pub token: String,
365 pub token_type_hint: Option<String>,
367 pub token_endpoint_auth_method: Option<String>,
369}
370
371#[derive(Debug, Clone, Serialize, Deserialize)]
373pub struct IntrospectResponse {
374 pub active: bool,
376 #[serde(skip_serializing_if = "Option::is_none")]
378 pub scope: Option<String>,
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub client_id: Option<String>,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub username: Option<String>,
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub token_type: Option<String>,
388 #[serde(skip_serializing_if = "Option::is_none")]
390 pub exp: Option<i64>,
391 #[serde(skip_serializing_if = "Option::is_none")]
393 pub iat: Option<i64>,
394 #[serde(skip_serializing_if = "Option::is_none")]
396 pub nbf: Option<i64>,
397 #[serde(skip_serializing_if = "Option::is_none")]
399 pub sub: Option<String>,
400 #[serde(skip_serializing_if = "Option::is_none")]
402 pub aud: Option<Vec<String>>,
403 #[serde(skip_serializing_if = "Option::is_none")]
405 pub iss: Option<String>,
406 #[serde(skip_serializing_if = "Option::is_none")]
408 pub jti: Option<String>,
409}
410
411#[derive(Debug, Clone)]
413pub struct RefreshTokenRequest {
414 pub issuer: String,
416 pub client_id: String,
418 pub client_secret: Option<String>,
420 pub refresh_token: String,
422 pub scope: Option<String>,
424 pub token_endpoint_auth_method: Option<String>,
426}
427
428#[derive(Debug, Clone, Serialize, Deserialize)]
430pub struct UserInfo {
431 pub sub: String,
433 #[serde(skip_serializing_if = "Option::is_none")]
435 pub name: Option<String>,
436 #[serde(skip_serializing_if = "Option::is_none")]
438 pub given_name: Option<String>,
439 #[serde(skip_serializing_if = "Option::is_none")]
441 pub family_name: Option<String>,
442 #[serde(skip_serializing_if = "Option::is_none")]
444 pub middle_name: Option<String>,
445 #[serde(skip_serializing_if = "Option::is_none")]
447 pub nickname: Option<String>,
448 #[serde(skip_serializing_if = "Option::is_none")]
450 pub preferred_username: Option<String>,
451 #[serde(skip_serializing_if = "Option::is_none")]
453 pub profile: Option<String>,
454 #[serde(skip_serializing_if = "Option::is_none")]
456 pub picture: Option<String>,
457 #[serde(skip_serializing_if = "Option::is_none")]
459 pub website: Option<String>,
460 #[serde(skip_serializing_if = "Option::is_none")]
462 pub email: Option<String>,
463 #[serde(skip_serializing_if = "Option::is_none")]
465 pub email_verified: Option<bool>,
466 #[serde(skip_serializing_if = "Option::is_none")]
468 pub gender: Option<String>,
469 #[serde(skip_serializing_if = "Option::is_none")]
471 pub birthdate: Option<String>,
472 #[serde(skip_serializing_if = "Option::is_none")]
474 pub zoneinfo: Option<String>,
475 #[serde(skip_serializing_if = "Option::is_none")]
477 pub locale: Option<String>,
478 #[serde(skip_serializing_if = "Option::is_none")]
480 pub phone_number: Option<String>,
481 #[serde(skip_serializing_if = "Option::is_none")]
483 pub phone_number_verified: Option<bool>,
484 #[serde(skip_serializing_if = "Option::is_none")]
486 pub address: Option<serde_json::Value>,
487 #[serde(skip_serializing_if = "Option::is_none")]
489 pub updated_at: Option<i64>,
490 #[serde(skip_serializing_if = "Option::is_none")]
493 pub xjp_admin: Option<bool>,
494 #[serde(skip_serializing_if = "Option::is_none")]
496 pub amr: Option<Vec<String>>,
497 #[serde(skip_serializing_if = "Option::is_none")]
499 pub auth_time: Option<i64>,
500}
501
502#[derive(Debug, Clone, Serialize, Deserialize)]
504pub struct ClientConfig {
505 pub client_id: String,
507 #[serde(skip_serializing_if = "Option::is_none")]
509 pub client_secret: Option<String>,
510 pub client_name: String,
512 pub redirect_uris: Vec<String>,
514 #[serde(skip_serializing_if = "Option::is_none")]
516 pub post_logout_redirect_uris: Option<Vec<String>>,
517 pub grant_types: Vec<String>,
519 pub response_types: Vec<String>,
521 pub token_endpoint_auth_method: String,
523 pub scope: String,
525 #[serde(skip_serializing_if = "Option::is_none")]
527 pub client_secret_expires_at: Option<i64>,
528}