Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

JWT Token 认证

Feature: jwt

配置

[token]
expire = 3600    # 过期时间(小时)
secret = "your-secret-key"

API

Token

方法参数返回说明
create_token<T>user_id: i64, data: TResult<String>生成 JWT,嵌入泛型数据
verify_token<T>token: &strResult<Claims<T>>验证并解析 JWT(含泛型数据)
get_idtoken: &strResult<i64>从 JWT 提取 user_id
get_data<T>token: &strResult<T>验证 JWT 并提取嵌入的泛型数据

Claims

#![allow(unused)]
fn main() {
pub struct Claims<T = ()> {
    pub sub: String,      // user_id 字符串
    pub exp: usize,       // 过期时间戳
    pub uid: i64,         // user_id
    pub data: Option<T>,  // 嵌入的泛型数据
}
}

T 默认为 (),此时 dataNone。调用 get_id 时使用 Claims<()> 解析,忽略 data 字段。

错误码

English中文
40101Invalid token无效的令牌
40102Token expired令牌已过期
50101JWT encode failedJWT 编码失败
50102JWT verify failedJWT 验证失败
50103Token data not found令牌中未找到嵌入数据

使用示例

#![allow(unused)]
fn main() {
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct UserData {
    id: i64,
    username: String,
    is_super: bool,
}

// 生成 Token(嵌入自定义数据)
let data = UserData { id: 1, username: "admin".into(), is_super: true };
let token = state.token.create_token(user_id, &data)?;

// 提取 user_id(忽略 data)
let user_id = state.token.get_id(&token)?;

// 验证并获取完整声明
let claims = state.token.verify_token::<UserData>(&token)?;
println!("user: {}, data: {:?}", claims.uid, claims.data);

// 直接获取嵌入的数据
let data = state.token.get_data::<UserData>(&token)?;
println!("username: {}", data.username);
}