一分钟学会 Rust 生成 JWT和校验

3/8/2025

JWT 在 web 开发中作用毋庸置疑。下面我们快速的了解 jwt 在 rust 中的使用。

JWT 基础知识

JWT 是一种用于安全传输信息的轻量级、无状态的标准,适用于身份验证和信息交换场景。通过签名验证和自包含的声明,它能够高效地传递用户信息,同时减少服务器负担。

JWT 组成

Header.Payload.Signature
  • Header: 类型(typ)和算法(alg, 指定 hash 签名算法),Header 对象会被比 base64URL 编码。
  • Payload:负载部分(事件传递的数据),可以分为三类:注册 Claims公共 Claims以及私有 Claims,Payload 也会被 base64URL 编码。
  • Signature: 签名部分,用于验证消息的完整性,并确保消息在传输过程中未被篡改。

他们直接通过点 . 链接

依赖

[dependencies]
chrono = "0.4.38"
dotenv = "0.15.0"
jsonwebtoken = { version = "9.3.0", features = [] }
serde = { version = "1.0.210", features = ["derive"] }

env 文件

使用 dotenv 将 jwt 需要 secet 放在 env 文件中

JWT_SECRET=your_secret_key

token 的创建和解析

生成解析 token 需要:

  • Algorithm 算法
  • Claims 有效负载数据。
  • chrono 世间处理

实现

jwt 创建和解析十分重要,我们将 jwt 的单独封装到 utils/jwt.rs下

use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey, Algorithm, TokenData};
use serde::{Serialize, Deserialize};
use chrono::{Utc, Duration};
use std::error::Error;
use std::env;

// Define the claims structure
#[derive(Debug, Serialize, Deserialize)]
pub struct Claims {
    sub: String,          // Subject (user ID, email, etc.)
    exp: usize,           // Expiration time (as UTC timestamp)
}

pub fn create_jwt(sub: &str) -> Result<String, Box<dyn Error>> {
    let secret = env::var("JWT_SECRET").expect("JWT_SECRET must be set");
    // Define some claims
    let my_claims = Claims {
        sub: sub.to_owned(),
        exp: (Utc::now() + Duration::hours(24)).timestamp() as usize, // JWT expires in 24 hours
    };

    // Encoding the token
    let token = encode(
        &Header::default(),
        &my_claims,
        &EncodingKey::from_secret(secret.as_ref()),
    )?;

    Ok(token)
}

pub fn verify_jwt(token: &str) -> Result<TokenData<Claims>, Box<dyn Error>> {
    let secret = env::var("JWT_SECRET").expect("JWT_SECRET must be set");
    let token_data = decode::<Claims>(
        token,
        &DecodingKey::from_secret(secret.as_ref()),
        &Validation::new(Algorithm::HS256),
    )?;
    Ok(token_data)
}
  • create_jwt 对外暴露,接受 sub 作为参数,传递给 Claims 结构体。然后使用 encode 进行加密即可。
  • verify_jwt 一般是用在请求拦截器中,请求头中 headers 获取 token 进行解析。

小结

本文主要讲解 jwt 在 rust 中使用。本质就是 Claims 对象和 token 创建与解析。我们需要一些 web 组件像 jsonwebtoken、chrono、dotenv 和 serde 等。JWT 往往单独的放在一个单独的 utils 模块中方便能使用时调用。