fire_auth_token/
structs.rs1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3use std::error::Error;
4use std::fmt;
5use std::sync::Arc;
6use time::OffsetDateTime;
7use tokio::sync::RwLock;
8
9#[derive(Debug, Clone)]
11pub struct SharedState {
12 pub keys: PublicKeysResponse,
13 pub expiry: OffsetDateTime,
14}
15
16
17#[derive(Debug, Deserialize, Serialize)]
19pub struct FirebaseTokenHeader {
20 pub alg: String,
22 pub kid: String,
24}
25
26#[derive(Debug, Deserialize, Serialize)]
28pub struct FirebaseTokenPayload {
29 pub exp: i64,
31 pub iat: i64,
33 pub aud: String,
35 pub iss: String,
37 pub sub: String,
39 pub auth_time: i64,
41}
42
43#[derive(Debug, Deserialize, Clone)]
45pub struct PublicKeysResponse {
46 #[serde(flatten)]
47 pub keys: HashMap<String, String>,
48}
49
50#[derive(Debug, Clone)]
52pub struct FirebaseAuthConfig {
53 pub project_id: String,
55 pub public_keys_url: String,
57}
58
59#[derive(Debug, Clone)]
61pub struct FirebaseAuthUser {
62 pub uid: String,
64 pub issued_at: OffsetDateTime,
66 pub expires_at: OffsetDateTime,
68 pub auth_time: OffsetDateTime,
70}
71
72#[derive(Debug)]
74pub struct FirebaseAuth {
75 pub config: FirebaseAuthConfig,
77 pub cached_public_keys: Arc<RwLock<Option<SharedState>>>,
79}
80
81#[derive(Debug)]
83pub enum FirebaseAuthError {
84 InvalidTokenFormat,
85 TokenExpired,
86 InvalidSignature,
87 InvalidIssuer,
88 InvalidAudience,
89 InvalidSubject,
90 InvalidAuthTime,
91 HttpError(String),
92 JwtError(String),
93}
94
95impl fmt::Display for FirebaseAuthError {
97 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98 match self {
99 FirebaseAuthError::InvalidTokenFormat => write!(f, "Invalid token format"),
100 FirebaseAuthError::TokenExpired => write!(f, "Token expired"),
101 FirebaseAuthError::InvalidSignature => write!(f, "Invalid signature"),
102 FirebaseAuthError::InvalidIssuer => write!(f, "Invalid issuer"),
103 FirebaseAuthError::InvalidAudience => write!(f, "Invalid audience"),
104 FirebaseAuthError::InvalidSubject => write!(f, "Invalid subject"),
105 FirebaseAuthError::InvalidAuthTime => write!(f, "Invalid authentication time"),
106 FirebaseAuthError::HttpError(msg) => write!(f, "HTTP request failed: {}", msg),
107 FirebaseAuthError::JwtError(msg) => write!(f, "JWT error: {}", msg),
108 }
109 }
110}
111
112impl Error for FirebaseAuthError {
114 fn source(&self) -> Option<&(dyn Error + 'static)> {
115 None
116 }
117}
118
119pub type FirebaseAuthResult<T> = Result<T, FirebaseAuthError>;