diff --git a/http/middleware/admin.go b/http/middleware/admin.go index f312f9b..fec4974 100644 --- a/http/middleware/admin.go +++ b/http/middleware/admin.go @@ -17,7 +17,7 @@ func AdminAuth() gin.HandlerFunc { c.Abort() return } - user := service.AllService.UserService.InfoByAccessToken(token) + user, ut := service.AllService.UserService.InfoByAccessToken(token) if user.Id == 0 { response.Fail(c, 403, "请先登录") c.Abort() @@ -26,6 +26,8 @@ func AdminAuth() gin.HandlerFunc { c.Set("curUser", user) c.Set("token", token) + //如果时间小于1天,token自动续期 + service.AllService.UserService.AutoRefreshAccessToken(ut) c.Next() } diff --git a/http/middleware/rustauth.go b/http/middleware/rustauth.go index 9b7a3a2..292678c 100644 --- a/http/middleware/rustauth.go +++ b/http/middleware/rustauth.go @@ -28,7 +28,7 @@ func RustAuth() gin.HandlerFunc { //这里只是简单的提取 token = token[7:] //验证token - user := service.AllService.UserService.InfoByAccessToken(token) + user, ut := service.AllService.UserService.InfoByAccessToken(token) if user.Id == 0 { c.JSON(401, gin.H{ "error": "Unauthorized", @@ -46,6 +46,9 @@ func RustAuth() gin.HandlerFunc { c.Set("curUser", user) c.Set("token", token) + + service.AllService.UserService.AutoRefreshAccessToken(ut) + c.Next() } } diff --git a/service/user.go b/service/user.go index e6ae890..8a4fd47 100644 --- a/service/user.go +++ b/service/user.go @@ -53,18 +53,18 @@ func (us *UserService) InfoByUsernamePassword(username, password string) *model. } // InfoByAccesstoken 根据accesstoken取用户信息 -func (us *UserService) InfoByAccessToken(token string) *model.User { +func (us *UserService) InfoByAccessToken(token string) (*model.User, *model.UserToken) { u := &model.User{} ut := &model.UserToken{} global.DB.Where("token = ?", token).First(ut) if ut.Id == 0 { - return u + return u, ut } if ut.ExpiredAt < time.Now().Unix() { - return u + return u, ut } global.DB.Where("id = ?", ut.UserId).First(u) - return u + return u, ut } // GenerateToken 生成token @@ -217,8 +217,9 @@ func (us *UserService) Delete(u *model.User) error { } tx.Commit() // 删除关联的peer - return AllService.PeerService.EraseUserId(u.Id); err != nil { - return errors.New("User deleted successfully, but failed to unlink peer.") + if err := AllService.PeerService.EraseUserId(u.Id); err != nil { + global.Logger.Warn("User deleted successfully, but failed to unlink peer.") + return nil } return nil } @@ -447,3 +448,13 @@ func (us *UserService) getAdminUserCount() int64 { global.DB.Model(&model.User{}).Where("is_admin = ?", true).Count(&count) return count } + +func (us *UserService) RefreshAccessToken(ut *model.UserToken) { + ut.ExpiredAt = time.Now().Add(time.Hour * 24 * 7).Unix() + global.DB.Model(ut).Update("expired_at", ut.ExpiredAt) +} +func (us *UserService) AutoRefreshAccessToken(ut *model.UserToken) { + if ut.ExpiredAt-time.Now().Unix() < 86400 { + us.RefreshAccessToken(ut) + } +}