Skip to main content

wae_authentication/jwt/
errors.rs

1//! JWT 错误类型定义
2
3use std::fmt;
4
5/// JWT 错误类型
6#[derive(Debug)]
7pub enum JwtError {
8    /// 无效的令牌
9    InvalidToken(String),
10
11    /// 令牌已过期
12    TokenExpired,
13
14    /// 令牌尚未生效
15    TokenNotValidYet,
16
17    /// 无效的签名
18    InvalidSignature,
19
20    /// 无效的算法
21    InvalidAlgorithm,
22
23    /// 缺少必要的声明
24    MissingClaim(String),
25
26    /// 无效的声明
27    InvalidClaim(String),
28
29    /// 签发者验证失败
30    InvalidIssuer { expected: String, actual: String },
31
32    /// 受众验证失败
33    InvalidAudience,
34
35    /// 密钥错误
36    KeyError(String),
37
38    /// 编码错误
39    EncodingError(String),
40
41    /// 解码错误
42    DecodingError(String),
43
44    /// 其他错误
45    Other(String),
46}
47
48impl fmt::Display for JwtError {
49    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50        match self {
51            JwtError::InvalidToken(msg) => write!(f, "Invalid token: {}", msg),
52            JwtError::TokenExpired => write!(f, "Token has expired"),
53            JwtError::TokenNotValidYet => write!(f, "Token is not yet valid"),
54            JwtError::InvalidSignature => write!(f, "Invalid signature"),
55            JwtError::InvalidAlgorithm => write!(f, "Invalid algorithm"),
56            JwtError::MissingClaim(claim) => write!(f, "Missing required claim: {}", claim),
57            JwtError::InvalidClaim(claim) => write!(f, "Invalid claim: {}", claim),
58            JwtError::InvalidIssuer { expected, actual } => {
59                write!(f, "Invalid issuer: expected {}, got {}", expected, actual)
60            }
61            JwtError::InvalidAudience => write!(f, "Invalid audience"),
62            JwtError::KeyError(msg) => write!(f, "Key error: {}", msg),
63            JwtError::EncodingError(msg) => write!(f, "Encoding error: {}", msg),
64            JwtError::DecodingError(msg) => write!(f, "Decoding error: {}", msg),
65            JwtError::Other(msg) => write!(f, "JWT error: {}", msg),
66        }
67    }
68}
69
70impl std::error::Error for JwtError {}
71
72impl From<jsonwebtoken::errors::Error> for JwtError {
73    fn from(err: jsonwebtoken::errors::Error) -> Self {
74        use jsonwebtoken::errors::ErrorKind;
75
76        match err.kind() {
77            ErrorKind::InvalidToken => JwtError::InvalidToken("malformed token".into()),
78            ErrorKind::InvalidSignature => JwtError::InvalidSignature,
79            ErrorKind::ExpiredSignature => JwtError::TokenExpired,
80            ErrorKind::ImmatureSignature => JwtError::TokenNotValidYet,
81            ErrorKind::InvalidAlgorithm => JwtError::InvalidAlgorithm,
82            ErrorKind::MissingRequiredClaim(claim) => JwtError::MissingClaim(claim.clone()),
83            ErrorKind::InvalidIssuer => JwtError::InvalidClaim("issuer".into()),
84            ErrorKind::InvalidAudience => JwtError::InvalidAudience,
85            ErrorKind::InvalidSubject => JwtError::InvalidClaim("subject".into()),
86            _ => JwtError::Other(err.to_string()),
87        }
88    }
89}
90
91/// JWT 结果类型
92pub type JwtResult<T> = Result<T, JwtError>;