@@ -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()
|
||||
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user