Token 身份认证教程

这套教程面向正在学习 Node.js 与 TypeScript 的初学者,目标是理解并实现一套包含注册、登录、接口鉴权、刷新 Token 和退出登录的认证流程。

教程使用以下两个核心库:

本教程根据 2026-08-12 可见的官方文档编写。库版本变化时,应优先核对官方 README 和发布说明。

先记住两个职责

注册:密码 --argon2.hash()--> 密码哈希 --保存--> 数据库

登录:输入密码 + 数据库密码哈希 --argon2.verify()--> 是否匹配
                                            |
                                            v
                                      匹配后签发 Token

后续请求:Access Token --jwt.verify()--> 当前用户身份

argon2 解决“密码如何安全保存和验证”,jsonwebtoken 解决“登录成功后如何携带和验证身份凭证”。二者不是替代关系。

章节目录

  1. 密码学基础:编码、哈希、加密与签名
  2. JWT 原理:Header、Payload 与 Signature
  3. jsonwebtoken 教程
  4. Access Token 与 Refresh Token
  5. 密码安全与 Argon2 原理
  6. node-argon2 教程
  7. 认证系统案例设计
  8. 实战:注册与登录
  9. 实战:认证中间件与权限检查
  10. 实战:刷新 Token 与退出登录
  11. 安全清单与常见错误
  12. 练习题与复盘

完整业务流程

注册
  -> 校验输入
  -> Argon2 哈希密码
  -> 保存用户和 passwordHash

登录
  -> 根据账号查找用户
  -> Argon2 验证密码
  -> 创建登录会话
  -> 签发短期 Access Token
  -> 生成长期 Refresh Token

访问受保护接口
  -> 客户端发送 Authorization: Bearer <accessToken>
  -> 服务端验证签名、算法、签发方、接收方和过期时间
  -> 读取当前用户 ID
  -> 执行业务权限判断

刷新
  -> 校验 Refresh Token
  -> 检查服务端会话是否有效
  -> 轮换 Refresh Token
  -> 签发新的 Access Token

退出登录
  -> 撤销服务端会话
  -> 客户端删除本地凭证

与当前项目配置的关系

当前项目在源码中使用 import,由 TypeScript 按 CommonJS 模式转换,并通过 ts-node server.ts 运行:

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true
  }
}

因此教程采用:

import jwt from "jsonwebtoken";
import * as argon2 from "argon2";

安装命令:

npm install jsonwebtoken argon2
npm install --save-dev @types/jsonwebtoken

argon2 自带 TypeScript 类型声明;jsonwebtoken 通常搭配 @types/jsonwebtoken

目前项目尚未安装这两个依赖。教程只新增 Markdown 文档,不修改 package.json,也不改变 CommonJS 运行方式。

案例范围

案例使用“内存数组模拟数据库”,目的是集中学习认证流程。现实项目应替换为 MySQL 等持久化存储,并为用户名、会话 ID 等字段增加唯一约束和索引。

教学示例采用:

这里对两类哈希作了不同选择:用户密码需要抵抗暴力破解,所以使用故意较慢、消耗内存的 Argon2id;Refresh Token 本身是高熵随机值,不是人类选择的弱密码,因此可使用 SHA-256 建立快速索引和避免明文落库。

官方资料