use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
pub mod generator;
pub mod validator;
pub mod jwt;
pub use generator::TokenGenerator;
pub use validator::TokenValidator;
pub use jwt::{JwtManager, JwtClaims, JwtAlgorithm};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct TokenValue(String);
impl TokenValue {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl From<String> for TokenValue {
fn from(s: String) -> Self {
Self(s)
}
}
impl From<TokenValue> for String {
fn from(v: TokenValue) -> Self {
v.0
}
}
impl std::fmt::Display for TokenValue {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenInfo {
pub token: TokenValue,
pub login_id: String,
pub login_type: String,
pub create_time: DateTime<Utc>,
pub last_active_time: DateTime<Utc>,
pub expire_time: Option<DateTime<Utc>>,
pub device: Option<String>,
pub extra_data: Option<serde_json::Value>,
pub nonce: Option<String>,
pub refresh_token: Option<String>,
pub refresh_token_expire_time: Option<DateTime<Utc>>,
}
impl TokenInfo {
pub fn new(token: TokenValue, login_id: impl Into<String>) -> Self {
let now = Utc::now();
Self {
token,
login_id: login_id.into(),
login_type: "default".to_string(),
create_time: now,
last_active_time: now,
expire_time: None,
device: None,
extra_data: None,
nonce: None,
refresh_token: None,
refresh_token_expire_time: None,
}
}
pub fn is_expired(&self) -> bool {
if let Some(expire_time) = self.expire_time {
Utc::now() > expire_time
} else {
false
}
}
pub fn update_active_time(&mut self) {
self.last_active_time = Utc::now();
}
}
#[derive(Debug, Clone)]
pub struct TokenSign {
pub value: String,
pub device: Option<String>,
}