Add renew refresh token

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2025-12-27 23:59:20 +08:00
parent 959bb8be0b
commit b6003544c8
2 changed files with 51 additions and 1 deletions

View File

@@ -128,6 +128,45 @@ func (self *Token) RefreshAccessToken(refreshToken string) (string, error) {
return self.GenerateAccessToken()
}
func (self *Token) RenewRefreshToken(refreshToken string) (string, error) {
err := self.RevokeRefreshToken(refreshToken)
if err != nil {
return "", err
}
refresh, err := self.GenerateRefreshToken()
// Store to redis
ctx := context.Background()
ttl := viper.GetDuration("ttl.refresh_ttl")
// refresh -> user
if err := data.Redis.Set(
ctx,
"refresh:"+refresh,
self.UserID.String(),
ttl,
).Err(); err != nil {
return "", err
}
// user -> refresh tokens
userSetKey := "user:" + self.UserID.String() + ":refresh_tokens"
if err := data.Redis.SAdd(
ctx,
userSetKey,
refresh,
).Err(); err != nil {
return "", err
}
// set user ttl >= all refresh token
_ = data.Redis.Expire(ctx, userSetKey, ttl).Err()
return refresh, nil
}
func (self *Token) RevokeRefreshToken(refreshToken string) error {
ctx := context.Background()

View File

@@ -27,7 +27,18 @@ func Refresh(c *gin.Context) {
return
}
err = JwtTool.RevokeRefreshToken(req.RefreshToken)
if err != nil {
c.JSON(500, gin.H{"status": "cannot revoke refresh token"})
}
refresh, err := JwtTool.GenerateRefreshToken()
if err != nil {
c.JSON(401, gin.H{"status": "cannot generate new refresh token"})
}
c.JSON(200, gin.H{
"access_token": access,
"access_token": access,
"refresh_token": refresh,
})
}