博客系统自文档 · 第 6/16 篇
目录 · 上一篇:管理后台能力地图 · 下一篇:API 级 RBAC
写在前面
四端(Home Web / uni-app / Admin / API)共用一套认证:JWT 校验用户身份,请求头带 Authorization。本篇讲登录从哪进、token 怎么刷、失败怎么防暴力。
功能与体验
| 方式 | Web 入口 | uni-app 入口 | 说明 |
|---|---|---|---|
| 账号密码 | /login |
/pages/auth/login |
用户名如 18888888888 |
| GitHub OAuth | Home 第三方登录 | — | 小程序端不可用 |
| 微信小程序 | — | 登录页「微信登录」 | wx.login → server 换 token |
| 邮箱验证码 | 注册 / 找回 | /pages/auth/register |
验证码存 Redis TTL |
登录成功后:
- Nuxt:Cookie 存
x-accessToken(及 refresh 相关) - uni-app:Pinia
store/token.ts持久化双 token,自动GET /user/refresh - Admin:Pinia + sessionStorage(
xia_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 或 /user/auth/wechat/miniprogram
S->>DB: 校验用户+密码(RSA解密) 或 wechatOpenId
S->>R: 清除/检查 auth: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、账号状态 |
微信小程序登录(2026-06)
- 小程序
wx.login()取得code POST /user/auth/wechat/miniprogram传{ code }- server 调微信
jscode2session得openid,查/建用户(user.wechatOpenId) - 返回 accessToken + refreshToken
SQL patch:deploy/sql/patches/2026-06-22-wechat-miniprogram-login.sql(公开接口 isPublic=1)。
安全机制
| 机制 | 存储 | 行为 |
|---|---|---|
| 登录失败计数 | Redis auth:login:fail:{username}:{ip} |
多次失败锁定 |
| 登录锁 | Redis auth:login:lock:{username}:{ip} |
临时禁止登录 |
| refresh 黑名单 | Redis auth:refresh:blacklist:{hash} |
登出/吊销 refresh |
| OAuth ticket | Redis auth:oauth:ticket:{uuid} |
60s 一次性 |
| 图形验证码 | Redis captcha:* |
账号密码登录、注册/敏感操作 |
密码传输:前端 RSA 加密 → 后端 rsaDecrypt 再 bcrypt 比对。
GitHub OAuth 简流程(Web)
- 跳转 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)创建管理员。 - 四端 token 存储不同:改 refresh 逻辑须同时测 Nuxt Cookie 与 uni-app Pinia。
系列导航
- 目录:博客系统分类
- 上一篇:05 管理后台能力地图
- 下一篇:07 API 级 RBAC
- 导读:导读 · 第 0 篇
延伸阅读
blog-server/src/modules/security/auth/blog-home-uniapp/src/api/login.ts、src/store/token.ts- Home:
middleware/auth.global.ts、api/request.ts(refresh 逻辑)

全部评论(0)