Rocket框架JWT鉴权实战:保护Rust Web API的安全方案​

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本篇文章是基于rust语言和rocket依赖实现网页JWT认证和鉴权,完成简单的JWT token的验证和鉴权处理,使用cargo做依赖的导入和测试。

 ✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨

这里有:

  • 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
  • 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
  • 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!

👉 点击直达→ 盹猫猫的个人小站 👈

🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~

目录

一、概述

二、相关依赖

三、环境准备

3.1 创建项目

3.2 读取私钥信息

3.3 token数据负载

3.4 生成token

四、Web鉴权

4.1 验证载体

4.2 接收请求

五、总结


Welcome to Code Block's blog

本篇文章主要介绍了

[Rocket框架JWT鉴权实战:保护Rust Web API的安全方案]

❤博主广交技术好友,喜欢文章的可以关注一下❤

一、概述

       本篇文章是基于rust语言和rocket依赖实现网页JWT认证和鉴权,完成简单的JWT token的验证和鉴权处理,使用cargo做依赖的导入和测试。

什么是rocket?

       Rust Rocket 是一个基于 Rust 编程语言的 Web 框架,用于构建高性能、安全的 Web 应用程序。Rocket 以其简洁的语法、强大的类型系统和易用性而闻名,特别适合那些希望利用 Rust 的内存安全性和并发性能来开发 Web 服务的开发者。

二、相关依赖

Cargo.toml

[package]
name = "webapp"
version = "0.1.0"
edition = "2024"
[dependencies]
chrono = "0.4.40"
dotenv = "0.15.0"
jsonwebtoken = "9.3.1"
rocket = { version = "0.5.1", features = ["json"] }
serde = { version = "1.0.219", features = ["derive"] }

image.gif

chrono:一个 Rust 的日期和时间处理库,提供了丰富的时间和日期操作功能,类似于其他编程语言中的 java.time 或 Python 的 datetime 模块。

dotenv:一个用于加载环境变量的库,允许开发者将配置参数存储在 .env 文件中,从而简化配置管理和环境设置。

jsonwebtoken:一个用于生成和验证 JSON Web Token (JWT) 的库。JWT 常用于身份验证和授权,允许在不同服务之间安全地传输信息。

rocket:一个现代、快速且易于使用的 Rust Web 框架,旨在利用 Rust 的类型系统和并发能力,提供高性能的 Web 服务。

serde:一个用于序列化和反序列化数据的框架,支持多种数据格式(如 JSON、YAML、TOML 等)。它通过派生宏简化了序列化代码的编写。

通过上述依赖可以看出,Rust在Web方面的生态建设也是十分全面的,相关的依赖也比较完善。

三、环境准备

3.1 创建项目

使用cargo创建一个名为webapp项目,使用以下命令进行创建:

cargo init webapp //创建项目
cd webapp //移动到目录内

image.gif

在wabapp文件夹内依次运行以下命令进行安装(或将Cargo.toml文件内数据复制到文件夹的Cargo.toml文件内),使用cargo install进行安装

cargo add chrono
cargo add dotenv
cargo add jsonwebtoken
cargo add rocket
cargo add serde

image.gif

在文件夹内创建一个 .env文件,用于存储JWT的私钥信息,并在.env文件内添加以下内容:

JWT_SECRET = 123456

image.gif

3.2 读取私钥信息

使用以下代码读取私钥信息,这里用到了dotenv库:

// 从环境变量中获取密钥
fn get_secret() -> String {
    dotenv().ok();
    env::var("JWT_SECRET").expect("JWT_SECRET must be set")
}

image.gif

3.3 token数据负载

这里先创建一个Claims用于存储生成和解析完成后的Token信息,其代码如下:

use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct Claims {
    pub sub: String, // 主题,通常是用户ID
    pub exp: usize,  // 过期时间,UNIX 时间戳
    //根据需要添加其它字段
}

image.gif

sub:用于存储用户数据,通常是用户的ID。

exp:过期时间,即token多长时间后失效。

这里用到了serde依赖,用于序列化和反序列化数据。

3.4 生成token

       通过用户id和过期时间生成token字符串(其中获取过期时间时使用了chrono依赖),通过初始化claims数据,获取的私钥和头部信息,生成token字符串(生成时使用的是jsonwebtoken依赖的encode方法)。具体方法实现如下:

/// 生成 JWT
pub fn create_jwt(
    user_id: &str,
    expiration_minutes: usize,
) -> Result<String, jsonwebtoken::errors::Error> {
    //获取过期的时间戳
    let expiration = Utc::now()
        .checked_add_signed(Duration::minutes(expiration_minutes as i64))
        .expect("valid timestamp")
        .timestamp();
    //初始化claims数据
    let claims = Claims {
        sub: user_id.to_owned(),
        exp: expiration as usize,
    };
    //获取私钥数据
    let secret = get_secret();
    //jwt的头部信息(加密算法)
    let header = Header::default();
    //进行生成并返回
    encode(&header, &claims, &EncodingKey::from_secret(secret.as_ref()))
}

image.gif

四、Web鉴权

4.1 验证载体

       这里先创建一个验证通过后的载体JwtGuard,内容如下:

#[derive(Debug, Serialize)]
#[serde(crate = "rocket::serde")]
pub struct JwtGuard {
    pub claims: Claims, // 验证通过后,存储解析的 Claims
}

image.gif

       因为rocket是通过一个FromRequest进行拦截Request请求, 所有让JwtGuard去实现FromRequest,实现其中的from_request请求,内容如下:

#[rocket::async_trait]
impl<'r> FromRequest<'r> for JwtGuard {
    type Error = String;
    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
        // 1. 从 Header 获取 Token
        let token = match request.headers().get_one("token") {
            Some(t) => t,
            None => return Outcome::Error((Status::Unauthorized, "Missing token".to_string())),
        };
        
        // 2. 从环境变量获取 JWT_SECRET
        let secret = get_secret();
        // 3. 验证 Token
        match decode::<Claims>(
            token, 
            &DecodingKey::from_secret(secret.as_ref()), 
            &Validation::new(Algorithm::HS256), //生成时的加密方法
        ) {
            Ok(token_data) => Outcome::Success(JwtGuard {
                claims: token_data.claims,
            }),
            Err(e) => Outcome::Error((Status::Unauthorized, format!("Invalid token: {}", e))),
        }
    }
}

image.gif

       普遍的方法是从请求头中获取token,从环境变量中获取私钥 ,通过jsonwebtoken依赖中的decode方法对token进行验证,成功后使用Outcome::Success()将JwtGuard传递出去(就是通过验证),错误则提示Unauthorized。

4.2 接收请求

在main.rs中可以使用如下方法接收请求:

mod jwt;
#[macro_use]
extern crate rocket;
use jwt::{JwtGuard, create_jwt};
use rocket::serde::json::Json;
#[get("/jwt")]
fn login_token(_jwt: JwtGuard) -> String {
    //模拟用户登陆获取jwt token请求
    let token = create_jwt("1122", 1).unwrap();
    token
}
#[get("/check")]
fn check_token(_jwt: JwtGuard) -> Json<JwtGuard> {
    //模拟用户通过验证请求
    Json(_jwt)
}
#[launch]
fn rocket() -> _ {
    //注册到路径
    rocket::build().mount("/", routes![login_token, check_token])
}

image.gif

注意:这里_jwt: JwtGuard已经被实现,所以当参数有JwtGuard时,表示该请求路径要求被认证,如果不添加,则表示该方法不需被认证,这样就实现了白名单的功能。

五、总结

       通过cargo去实现web验证,可以看出,rocket在web鉴权功能实现时,要求代码简洁、易实现,各种注解的支持也非常的多。同时,同时由于Rust语言本身的特性,在实际的处理速度方面也有着不错的表现。

如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链

感谢您的关注和收藏!!!!!!

image.gif 编辑


目录
相关文章
|
18天前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
19天前
|
缓存 自然语言处理 API
阿里巴巴国际站关键字搜索 API 实战:3 步搞定多语言适配 + 限流破局,询盘量提升 40%
跨境电商API开发常陷合规、多语言、限流等坑。本文详解从国际合规(GDPR/CCPA)到参数优化、数据结构化及区域化搜索的全链路方案,附Python代码模板与缓存重试架构,助力提升调用成功率至99%+,精准询盘增长42%。
|
29天前
|
开发者 API 机器学习/深度学习
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
本文详解淘宝、1688、义乌购三大平台图片搜索接口的核心特点、调用流程与实战代码。涵盖跨平台对比、参数配置、响应解析及避坑指南,支持URL/Base64上传,返回商品ID、价格、销量等关键信息,助力开发者快速实现商品识别与比价功能。
淘宝 / 1688 / 义乌购图搜 API 实战指南:接口调用与商业场景应用
|
1月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
2月前
|
人工智能 运维 监控
阿里云 API 聚合实战:破解接口碎片化难题,3 类场景方案让业务响应提速 60%
API聚合破解接口碎片化困局,助力开发者降本增效。通过统一中间层整合微服务、第三方接口与AI模型,实现调用次数减少60%、响应提速70%。阿里云实测:APISIX+函数计算+ARMS监控组合,支撑百万级并发,故障定位效率提升90%。
218 0
|
2月前
|
JSON API 调度
Midjourney 技术拆解与阿里云开发者实战指南:从扩散模型到 API 批量生成
Midjourney深度解析:基于优化Stable Diffusion,实现文本到图像高效生成。涵盖技术架构、扩散模型原理、API调用、批量生成系统及阿里云生态协同,助力开发者快速落地AIGC图像创作。
385 0
|
2月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
2月前
|
供应链 监控 安全
1688商品详情API接口实战指南:合规获取数据,驱动B2B业务增长
1688商品详情API(alibaba.product.get)是合规获取B2B商品数据的核心工具,支持全维度信息调用,助力企业实现智能选品、供应链优化与市场洞察,推动数字化转型。
|
2月前
|
缓存 监控 供应链
亚马逊 MWS API 实战:商品详情精准获取与跨境电商数据整合方案
本文详细解析亚马逊MWS API接口的技术实现,重点解决跨境商品数据获取中的核心问题。文章首先介绍MWS接口体系的特点,包括多站点数据获取、AWS签名认证等关键环节,并对比普通电商接口的差异。随后深入拆解API调用全流程,提供签名工具类、多站点客户端等可复用代码。针对跨境业务场景,文章还给出数据整合工具实现方案,支持缓存、批量处理等功能。最后通过实战示例展示多站点商品对比和批量选品分析的应用,并附常见问题解决方案。该技术方案可直接应用于跨境选品、价格监控等业务场景,帮助开发者高效获取亚马逊商品数据。
|
2月前
|
数据采集 JSON API
微店商品列表API接口开发指南:从零到实战
微店商品列表API(vdian.shop.item.list.get)用于获取店铺商品数据,支持分页、签名认证,返回JSON格式。适用于商品同步、竞品分析、多平台展示及数据清洗。提供Python请求示例,便于快速接入。