sa_token_core/token/
mod.rs

1// Author: 金书记
2//
3//! Token 管理模块
4
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7
8pub mod generator;
9pub mod validator;
10pub mod jwt;
11
12pub use generator::TokenGenerator;
13pub use validator::TokenValidator;
14pub use jwt::{JwtManager, JwtClaims, JwtAlgorithm};
15
16/// Token 值
17#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
18pub struct TokenValue(String);
19
20impl TokenValue {
21    pub fn new(value: impl Into<String>) -> Self {
22        Self(value.into())
23    }
24    
25    pub fn as_str(&self) -> &str {
26        &self.0
27    }
28}
29
30impl From<String> for TokenValue {
31    fn from(s: String) -> Self {
32        Self(s)
33    }
34}
35
36impl From<TokenValue> for String {
37    fn from(v: TokenValue) -> Self {
38        v.0
39    }
40}
41
42impl std::fmt::Display for TokenValue {
43    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44        write!(f, "{}", self.0)
45    }
46}
47
48/// Token 信息
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct TokenInfo {
51    /// Token 值
52    pub token: TokenValue,
53    
54    /// 登录 ID
55    pub login_id: String,
56    
57    /// 登录类型(user、admin 等)
58    pub login_type: String,
59    
60    /// Token 创建时间
61    pub create_time: DateTime<Utc>,
62    
63    /// Token 最后活跃时间
64    pub last_active_time: DateTime<Utc>,
65    
66    /// Token 过期时间(None 表示永不过期)
67    pub expire_time: Option<DateTime<Utc>>,
68    
69    /// 设备标识
70    pub device: Option<String>,
71    
72    /// 额外数据
73    pub extra_data: Option<serde_json::Value>,
74    
75    /// Nonce(用于防重放攻击)
76    pub nonce: Option<String>,
77    
78    /// Refresh Token(用于刷新访问令牌)
79    pub refresh_token: Option<String>,
80    
81    /// Refresh Token 过期时间
82    pub refresh_token_expire_time: Option<DateTime<Utc>>,
83}
84
85impl TokenInfo {
86    pub fn new(token: TokenValue, login_id: impl Into<String>) -> Self {
87        let now = Utc::now();
88        Self {
89            token,
90            login_id: login_id.into(),
91            login_type: "default".to_string(),
92            create_time: now,
93            last_active_time: now,
94            expire_time: None,
95            device: None,
96            extra_data: None,
97            nonce: None,
98            refresh_token: None,
99            refresh_token_expire_time: None,
100        }
101    }
102    
103    pub fn is_expired(&self) -> bool {
104        if let Some(expire_time) = self.expire_time {
105            Utc::now() > expire_time
106        } else {
107            false
108        }
109    }
110    
111    pub fn update_active_time(&mut self) {
112        self.last_active_time = Utc::now();
113    }
114}
115
116/// Token 签名
117#[derive(Debug, Clone)]
118pub struct TokenSign {
119    pub value: String,
120    pub device: Option<String>,
121}