主 题
博客系统自文档 · 第 6/16 篇
目录 · 上一篇:管理后台能力地图 · 下一篇:API 级 RBAC
写在前面
三端(Home / Admin / API)共用一套认证:JWT 存 Cookie,请求头带 Authorization。本篇讲登录从哪进、token 怎么刷、失败怎么防暴力。
功能与体验
| 方式 | 入口 | 说明 |
|---|---|---|
| 账号密码 | Home /login、Admin 登录页 |
用户名 18888888888 这类手机号账号 |
| GitHub OAuth | Home 第三方登录 | 回调换 ticket,Redis 一次性消费 |
| 邮箱验证码 | 注册 / 找回 | 验证码存 Redis TTL |
登录成功后:
- C 端 Cookie:
x-accessToken(及 refresh 相关) - Admin:Pinia + localStorage 存 token
- 后续请求自动带 JWT,
PermissionGuard再验 RBAC(第 07 篇)
设计与实现
sequenceDiagram
participant C as Client
participant S as blog-server
participant R as Redis
participant DB as MySQL
C->>S: POST /user/login
S->>DB: 校验用户+密码(RSA解密)
S->>R: 清除/检查 login:fail 计数
S-->>C: accessToken + refreshToken
C->>S: 业务 API + Bearer token
S->>S: JwtAuthGuard 解析 uid
核心组件
| 组件 | 路径 | 作用 |
|---|---|---|
JwtAuthGuard |
security/auth/jwt-auth.guard.ts |
路由级解析 JWT |
PermissionGuard |
全局 | API 路径 → privilegeCode |
| passport-jwt | 策略 | 从 header 取 token |
UserService.checkLoginForm |
登录校验 | 密码 hash、账号状态 |
安全机制
| 机制 | 存储 | 行为 |
|---|---|---|
| 登录失败计数 | Redis login:fail:* |
多次失败锁定 |
| 登录锁 | Redis login:lock:* |
临时禁止登录 |
| refresh 黑名单 | Redis refresh:blacklist:* |
登出/吊销 refresh |
| OAuth ticket | Redis oauth:login:ticket:* |
60s 一次性 |
| 图形验证码 | Redis captcha:* |
注册/敏感操作 |
密码传输:前端 RSA 加密 → 后端 rsaDecrypt 再 bcrypt 比对。
GitHub OAuth 简流程
- 跳转 GitHub 授权
- 回调 server,创建/绑定用户
- 写 Redis ticket → 重定向 Home 用 ticket 换 token
踩坑与取舍
- PermissionGuard 全局、JwtAuthGuard 按路由:公开 C 端接口靠 DB
isPublic=1,不是不加守卫就公开。 - Admin 生产加密:
.env.production开VITE_NUXT_OPEN_ENCRYPT,与 server 解密配套。 - 首次启动自动注册:
.env的account_username等会在 server 启动时register(init)创建管理员。
系列导航
- 导读 · 第 0 篇
- 下一篇:07 API 级 RBAC
延伸阅读
blog-server/src/modules/security/auth/- Home:
middleware/auth.global.ts、api/request.ts(refresh 逻辑)

全部评论(0)