注册

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

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 模块中方便能使用时调用。


作者:编程杂货铺
来源:juejin.cn/post/7424901483987304463

0 个评论

要回复文章请先登录注册