feat(auth): access token 缩到 2 小时 + refresh token 机制
后台登录框原来预填了 sundynix/sundynix,等于把凭证写在页面上,去掉。 令牌改为 access(2h) + refresh 两段式: - 新表 sundynix_refresh_tokens,只存 sha256,明文只在签发时返回一次 - 有效期:小程序 30 天、后台 7 天 - 新接口 /api/auth/refresh|logout、/api/admin/refresh|logout 安全约定: - 每次续期都轮换刷新令牌,旧的立即作废 - 作废后 60 秒内再到达算并发重试放行,超过则判定泄露、吊销该账号全部会话 - 主动退出与被连坐吊销的令牌不吃宽限期,否则「吊销全部」形同虚设 - 禁用用户时一并吊销刷新令牌,最多 2 小时彻底失去访问 两端请求层都做了单飞续期:并发请求同时 401 只发一次 refresh, 否则刷新令牌会被并发轮换掉互相打架。小程序续期失败回退 wx.login, 登录/续期请求标 noAuthRetry,避免登录失败(同样返回 40100)触发自我套娃。 顺带修掉 vite 代理仍指向 8080 的遗留(端口早已改 9090)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -35,6 +35,9 @@ func registerAuth(api *gin.RouterGroup, h *handler.Handler) {
|
||||
auth := api.Group("/auth")
|
||||
auth.POST("/login", h.Login)
|
||||
auth.POST("/wechat", h.WechatLogin)
|
||||
// 刷新/退出走刷新令牌,不需要(也不可能带)有效的 access token
|
||||
auth.POST("/refresh", h.RefreshToken)
|
||||
auth.POST("/logout", h.Logout)
|
||||
}
|
||||
|
||||
// 小程序用户接口(需 user JWT)
|
||||
@@ -113,6 +116,8 @@ func registerUserAPI(api *gin.RouterGroup, h *handler.Handler, jm *appjwt.Manage
|
||||
// 后台接口(登录开放,其余需 admin JWT)
|
||||
func registerAdminAPI(api *gin.RouterGroup, h *handler.Handler, jm *appjwt.Manager) {
|
||||
api.POST("/admin/login", h.AdminLogin)
|
||||
api.POST("/admin/refresh", h.AdminRefresh)
|
||||
api.POST("/admin/logout", h.AdminLogout)
|
||||
|
||||
g := api.Group("/admin")
|
||||
g.Use(middleware.AuthAdmin(jm))
|
||||
|
||||
Reference in New Issue
Block a user