sa_token_core/token/
mod.rs1use 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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct TokenInfo {
67 pub token: TokenValue,
69
70 pub login_id: String,
72
73 pub login_type: String,
75
76 pub create_time: DateTime<Utc>,
78
79 pub last_active_time: DateTime<Utc>,
81
82 pub expire_time: Option<DateTime<Utc>>,
84
85 pub device: Option<String>,
87
88 pub extra_data: Option<serde_json::Value>,
90
91 pub nonce: Option<String>,
93
94 pub refresh_token: Option<String>,
96
97 pub refresh_token_expire_time: Option<DateTime<Utc>>,
99}
100
101impl TokenInfo {
102 pub fn new(token: TokenValue, login_id: impl Into<String>) -> Self {
103 let now = Utc::now();
104 Self {
105 token,
106 login_id: login_id.into(),
107 login_type: "default".to_string(),
108 create_time: now,
109 last_active_time: now,
110 expire_time: None,
111 device: None,
112 extra_data: None,
113 nonce: None,
114 refresh_token: None,
115 refresh_token_expire_time: None,
116 }
117 }
118
119 pub fn is_expired(&self) -> bool {
120 if let Some(expire_time) = self.expire_time {
121 Utc::now() > expire_time
122 } else {
123 false
124 }
125 }
126
127 pub fn update_active_time(&mut self) {
128 self.last_active_time = Utc::now();
129 }
130}
131
132#[derive(Debug, Clone)]
134pub struct TokenSign {
135 pub value: String,
136 pub device: Option<String>,
137}