fire_auth_token/
structs.rsuse serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::error::Error;
use std::fmt;
use std::sync::Arc;
use time::OffsetDateTime;
use tokio::sync::RwLock;
#[derive(Debug, Clone)]
pub struct SharedState {
pub keys: PublicKeysResponse,
pub expiry: OffsetDateTime,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FirebaseTokenHeader {
pub alg: String,
pub kid: String,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct FirebaseTokenPayload {
pub exp: i64,
pub iat: i64,
pub aud: String,
pub iss: String,
pub sub: String,
pub auth_time: i64,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PublicKeysResponse {
pub keys: HashMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct FirebaseAuthConfig {
pub project_id: String,
pub public_keys_url: String,
}
#[derive(Debug, Clone)]
pub struct FirebaseAuthUser {
pub uid: String,
pub issued_at: OffsetDateTime,
pub expires_at: OffsetDateTime,
pub auth_time: OffsetDateTime,
}
#[derive(Debug)]
pub struct FirebaseAuth {
pub config: FirebaseAuthConfig,
pub cached_public_keys: Arc<RwLock<Option<SharedState>>>,
}
#[derive(Debug)]
pub enum FirebaseAuthError {
InvalidTokenFormat,
TokenExpired,
InvalidSignature,
InvalidIssuer,
InvalidAudience,
InvalidSubject,
InvalidAuthTime,
HttpError(String),
JwtError(String),
}
impl fmt::Display for FirebaseAuthError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FirebaseAuthError::InvalidTokenFormat => write!(f, "Invalid token format"),
FirebaseAuthError::TokenExpired => write!(f, "Token expired"),
FirebaseAuthError::InvalidSignature => write!(f, "Invalid signature"),
FirebaseAuthError::InvalidIssuer => write!(f, "Invalid issuer"),
FirebaseAuthError::InvalidAudience => write!(f, "Invalid audience"),
FirebaseAuthError::InvalidSubject => write!(f, "Invalid subject"),
FirebaseAuthError::InvalidAuthTime => write!(f, "Invalid authentication time"),
FirebaseAuthError::HttpError(msg) => write!(f, "HTTP request failed: {}", msg),
FirebaseAuthError::JwtError(msg) => write!(f, "JWT error: {}", msg),
}
}
}
impl Error for FirebaseAuthError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
None
}
}
pub type FirebaseAuthResult<T> = Result<T, FirebaseAuthError>;