不靠JWT手写会话Token系统:rust-web-app盐值Token生成、校验与自动续签原理

发布时间:2026/10/20 21:39:41

不靠JWT手写会话Token系统:rust-web-app盐值Token生成、校验与自动续签原理 不靠JWT手写会话Token系统rust-web-app盐值Token生成、校验与自动续签原理【免费下载链接】rust-web-appCode template for a production Web Application using Axum: The AwesomeApp Blueprint for Professional Web Development.项目地址: https://gitcode.com/gh_mirrors/ru/rust-web-apprust-web-app是一个基于 Rust Axum 的生产级 Web 应用模板AwesomeApp Blueprint它没有引入任何 JWT 库而是用不到百行代码手写了一整套会话 Token 系统完成 Token 的生成、签名校验与自动续签。本文带你拆解这套盐值 Token 机制的原理与落地方式帮你理解不依赖 JWT 也能做出安全的会话管理。 为什么不用 JWT而是手写 Token 系统JWT 是通用标准但对登录态维持这类典型场景它带来了不少额外成本JSON 序列化、Header/算法协商、签名算法选择等。rust-web-app 的取舍很直接极简依赖只用blake3哈希 base64url 编码不依赖任何 JWT 库字段精简会话 Token 只需要谁登录了 何时过期 签名三个信息完全可控过期策略、自动续签、失效方式全部自己说了算。核心实现在 crates/libs/lib-auth/src/token/mod.rs配合中间件 crates/libs/lib-web/src/middleware/mw_auth.rs 构成完整闭环。 Token 结构三段式字符串Token 的格式只有一行注释就能说清ident_b64u.exp_b64u.sign_b64u段内容说明第 1 段ident_b64u用户标识用户名的 base64url 编码告诉服务端这是谁的会话第 2 段exp_b64uRFC3339 过期时间如2023-05-17T15:30:00Z控制会话有效期第 3 段sign_b64u签名防止前两段被篡改解析与序列化分别由Token的FromStr与Display实现见 token/mod.rs 第 27~59 行格式不合法比如不是三段会直接返回InvalidFormat错误错误定义见 token/error.rs。 盐值签名全局密钥 用户盐值的双重保险签名函数token_sign_into_b64utoken/mod.rs 第 127~149 行的做法是将b64u(ident) . b64u(exp)拼接后连同**用户盐值salt和全局密钥key**一起喂给 blake3 哈希输出即为 base64url 编码的签名。这里有两个关键设计1️⃣ 每个用户独立的token_saltUUID用户表里为每人单独存了一个盐值建表语句见 sql/dev_initial/01-create-schema.sql 第 27 行token_salt uuid NOT NULL DEFAULT gen_random_uuid()好处很实际只需更新这一个 UUID该用户所有已签发的 Token 立刻全部作废——实现踢人下线或密码重置时使会话失效成本只是一条 UPDATE。2️⃣ 全局TOKEN_KEY参与哈希密钥来自环境变量配置加载逻辑见 lib-auth/src/config.rs字段包括TOKEN_KEY和TOKEN_DURATION_SEC会话有效期秒。密钥本身由项目自带的gen-key工具生成crates/tools/gen-key/src/main.rscargo run -p gen-key # 生成 512 bit 随机密钥及其 base64url 编码生成的密钥以环境变量SERVICE_TOKEN_KEY的形式注入服务密钥与代码分离部署更安全。✅ 请求校验流程中间件的 4 个步骤每次请求都会经过中间件mw_ctx_resolvermw_auth.rs 第 34~86 行流程如下读 Cookie从名为auth-token的 Cookie 中取出 Token 字符串解析把三段式字符串解析为Token查用户按用户名取出UserForAuth包含其token_salt模型定义见 lib-core/src/model/user.rs 第 60~67 行验签 验过期validate_web_token用同样的算法重算签名并逐字节比对再检查exp是否早于当前时间token/mod.rs 第 101~123 行。两个细节值得学习安全兜底只要校验失败除没有 Cookie外中间件会顺手删除该 Cookiemw_auth.rs 第 44~48 行避免客户端长期拿着坏 Token 反复失败Cookie 防 XSSset_token_cookielib-web/src/utils/token.rs 第 12~22 行设置了HttpOnly前端 JS 拿不到 Token降低脚本注入窃取会话的风险。 自动续签滑动过期的巧妙实现这套系统最优雅的部分——续签不需要任何额外接口。在ctx_resolve的第 79 行每次校验通过后中间件都会调用一次set_token_cookie用同一个盐值重新生成并下发新 Token过期时间重新计算。效果就是经典的滑动过期sliding expiration用户持续活跃 → 每次请求都把过期时间往后推会话永不掉线用户长时间不操作 → Token 到期自然失效无需服务端维护黑名单。配合登录/登出两端登录handlers_login.rs 的api_login_handler校验密码通过后写入 Token Cookie第 56 行登出api_logoff_handler直接删除 Cookie第 84 行立即失效。️ 部署配置清单启动服务前需要准备的环境变量见 lib-auth/src/config.rs 第 24~32 行环境变量作用来源SERVICE_TOKEN_KEY512 bit 签名密钥base64url 编码cargo run -p gen-key生成SERVICE_TOKEN_DURATION_SEC会话有效期秒自行设定SERVICE_PWD_KEY密码哈希密钥供密码模块使用同上方式生成 小结rust-web-app 这套手写会话 Token 系统给出的完整方案是三段式 Tokenident.exp.sign比 JWT 更轻信息够用即可blake3 签名签名内容 用户盐值 全局密钥一起哈希抗篡改用户级token_salt改一个 UUID 即可让该用户全部会话作废中间件自动续签校验即刷新零额外接口的滑动过期密钥工具链gen-key工具 环境变量注入密钥与代码解耦。对初学者来说读懂 crates/libs/lib-auth/src/token/ 这一小目录就能完整掌握自签名、自校验、自续签的会话管理思路——这正是手写 Token 系统相对框架封装的最大价值每一个字节都在你的理解之内。【免费下载链接】rust-web-appCode template for a production Web Application using Axum: The AwesomeApp Blueprint for Professional Web Development.项目地址: https://gitcode.com/gh_mirrors/ru/rust-web-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/18 12:04:40

PUBG压枪宏3步搞定:5分钟用罗技鼠标压住枪

PUBG压枪宏3步搞定:5分钟用罗技鼠标压住枪 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 瞄准敌人胸口按住扳机,前两发打…

2026/10/20 17:27:10

3 步解除 PDF 复制打印限制:PDFPatcher 单文件与批量处理完整指南

3 步解除 PDF 复制打印限制:PDFPatcher 单文件与批量处理完整指南 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址:…

2026/10/20 21:38:56

从Copilot到Agent:AI编程范式转移与小白实战指南

刚接触AI编程那会儿,我一度觉得Copilot已经够神奇了:敲个函数名它能帮你补完大半段逻辑,写个注释它能生成对应的代码块。但用了一段时间后才发现,这其实只是“快一点”的变化,并不是工作方式真正的转变。真正让我觉得“…

2026/10/20 21:38:56

Windows 10下Poppler库源码编译指南:依赖、CMake与排错

做 PDF 相关开发的人,绕不开 Poppler 这个名字。我手上的一个项目需要做页面渲染、文本抽取和 PDF 元数据解析,Linux 环境下一个apt install就能把全套工具和库装好,但切到 Windows 10 之后才发现事情没那么简单:官方不提供开箱即…

2026/10/20 21:38:56

降AIGC实战:从检测原理到工具应用,彻底解决AI疑似文本问题

学长亲荐!总算有人把降AIGC这件事说明白了又是一个深夜,对着屏幕上那篇改了七八遍的稿子,我盯着检测报告里那刺眼的疑似AI生成比例,心里只剩一个念头:这玩意儿到底怎么才能降下来?相信不少朋友都有同感——…

2026/10/20 21:38:56

Flutter鸿蒙适配全流程实战:从环境搭建到打包上架

这些年跨平台开发的工具箱里,Flutter 算是我用得最顺手的一个,渲染一致性好、热重载效率高,社区生态也够丰富。最近因为项目需要,我把一套 Flutter 应用移植到鸿蒙设备上跑通,整个过程踩了不少坑,也沉淀了一…

2026/10/20 21:38:56

大模型聚合平台:从API转发到智能调度的工程化演进

1. 为什么“聚合平台”正在成为大模型落地的隐形枢纽最近帮某高校实验室做一次AI工具选型调研,发现一个有意思的现象:团队里三位研究员,用的都是同一类任务——文本摘要、多轮对话、结构化信息抽取,但各自安装了五六个不同界面的客…

2026/10/20 21:33:53

WUJI Hand 2机械手转笔背后的灵巧操作工程原理

1. 为什么一只机械手转笔能刷屏?——从“WUJI Hand 2”看灵巧操作的工程本质你有没有在短视频里刷到过那个画面:一只银灰色的五指机械手,指尖轻巧地拨动一支中性笔,笔身在指关节间连续翻转三圈半,稳稳停在食指与中指之…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05:37

单片机C运行时从启动到多任务:中断安全与共享资源冲突

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑