sa_token_core/token/
mod.rs1use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7
8pub mod generator;
9pub mod validator;
10
11pub use generator::TokenGenerator;
12pub use validator::TokenValidator;
13
14#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
16pub struct TokenValue(String);
17
18impl TokenValue {
19 pub fn new(value: impl Into<String>) -> Self {
20 Self(value.into())
21 }
22
23 pub fn as_str(&self) -> &str {
24 &self.0
25 }
26}
27
28impl From<String> for TokenValue {
29 fn from(s: String) -> Self {
30 Self(s)
31 }
32}
33
34impl From<TokenValue> for String {
35 fn from(v: TokenValue) -> Self {
36 v.0
37 }
38}
39
40impl std::fmt::Display for TokenValue {
41 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42 write!(f, "{}", self.0)
43 }
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct TokenInfo {
49 pub token: TokenValue,
51
52 pub login_id: String,
54
55 pub login_type: String,
57
58 pub create_time: DateTime<Utc>,
60
61 pub last_active_time: DateTime<Utc>,
63
64 pub expire_time: Option<DateTime<Utc>>,
66
67 pub device: Option<String>,
69
70 pub extra_data: Option<serde_json::Value>,
72}
73
74impl TokenInfo {
75 pub fn new(token: TokenValue, login_id: impl Into<String>) -> Self {
76 let now = Utc::now();
77 Self {
78 token,
79 login_id: login_id.into(),
80 login_type: "default".to_string(),
81 create_time: now,
82 last_active_time: now,
83 expire_time: None,
84 device: None,
85 extra_data: None,
86 }
87 }
88
89 pub fn is_expired(&self) -> bool {
90 if let Some(expire_time) = self.expire_time {
91 Utc::now() > expire_time
92 } else {
93 false
94 }
95 }
96
97 pub fn update_active_time(&mut self) {
98 self.last_active_time = Utc::now();
99 }
100}
101
102#[derive(Debug, Clone)]
104pub struct TokenSign {
105 pub value: String,
106 pub device: Option<String>,
107}