token的生成和校验
Actix-web中,生成token的常见技术方案包括JSON Web Token(JWT)和基于随机字符串的 token;
1.添加依赖
[dependencies]
jsonwebtoken = "9.2.0"
2.创建token生成器
添加文件token_generator.rs
use chrono::Utc;
use jsonwebtoken::Algorithm;
use serde_json::json;
use jsonwebtoken::{decode, encode, Header, Validation, EncodingKey, DecodingKey};
use rand::Rng;
use rand::thread_rng;
use std::time::Duration;
use jsonwebtoken::Algorithm::HS512;
use serde_derive::{Deserialize, Serialize};
pub const TOKEN_SECRET: &str = "123456helloworld*_++";
#[derive(Debug, Serialize, Deserialize)]
pub struct TokenClaims {
userid: String,
exp: usize,
}
// 生成一个随机的 jwt_secret 密钥
pub fn generate_jwt_secret() -> String {
let rng = &mut thread_rng();
let bytes = rng.gen::<[u8; 32]>();
base64::encode(&bytes)
}
// 生成一个 JWT token
pub fn generate_jwt_token(user_id: &str, expiration_time: usize) -> Result<String, jsonwebtoken::errors::Error> {
let claims = TokenClaims {
userid:user_id.to_string(),
exp: expiration_time,
};
let header = Header::new(Algorithm::HS256);
encode(&header, &claims, &EncodingKey::from_secret(TOKEN_SECRET.as_ref()))
}
// 验证 JWT token
pub fn validate_jwt_token(token: &str) -> Result<TokenClaims, jsonwebtoken::errors::Error> {
let decoding_key = DecodingKey::from_secret(TOKEN_SECRET.as_ref());
let mut validation= Validation::default();// Algorithm::HS256 指定算法,根据实际使用的算法进行调整
validation.validate_exp = true;// 启用过期时间验证
let result = decode::<TokenClaims>(token, &decoding_key, &validation)?;
Ok(result.claims)
}
3.使用
let expiration_time = Utc::now().checked_add_signed(Duration::hours(1)).unwrap().timestamp() as usize;
let token = token_generator::generate_jwt_token( & user.userid, expiration_time).expect("Failed to generate JWT token");
println!("Generated JWT token: {}", token);
// 模拟验证JWT token的过程
match validate_jwt_token( & token) {
Ok(claims) => {
println ! ("Token valid. User ID: {}", claims.user_id);
},
Err(err) => {
println ! ("Failed to validate token: {}", err);
}
}
原文始发于微信公众号(ksnowlv):Actix Web关于token的生成和校验
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/254548.html