46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package redis_ser
|
|
|
|
import (
|
|
"EnGin/internal/db"
|
|
"EnGin/internal/global"
|
|
"EnGin/internal/utils/jwts"
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// Logout 标记当前令牌已注销 (拉入黑名单)
|
|
func Logout(accessToken, refreshToken string) {
|
|
atoken, err := jwts.CheckAccessToken(accessToken)
|
|
rtoken, err := jwts.CheckRefreshToken(refreshToken)
|
|
if err != nil {
|
|
global.Log.Error("token验证失败", zap.Error(err))
|
|
return
|
|
}
|
|
// 存储 access_token 黑名单 key
|
|
accessKey := fmt.Sprintf("logout_access_%s", accessToken)
|
|
// 存储 refresh_token 黑名单 key
|
|
refreshKey := fmt.Sprintf("logout_refresh_%s", refreshToken)
|
|
// 计算剩余有效期并作为 Redis 的过期时间缓存进去
|
|
db.Redis.Set(context.Background(), accessKey, "", atoken.ExpiresAt.Sub(time.Now()))
|
|
db.Redis.Set(context.Background(), refreshKey, "", rtoken.ExpiresAt.Sub(time.Now()))
|
|
}
|
|
|
|
// HasLogout 检查该 token 是否已经注销
|
|
func HasLogout(accessToken string) bool {
|
|
// 如果 Redis 没有开启,默认放行
|
|
if db.Redis == nil {
|
|
return false
|
|
}
|
|
|
|
accessKey := fmt.Sprintf("logout_access_%s", accessToken)
|
|
_, err := db.Redis.Get(context.Background(), accessKey).Result()
|
|
if err == nil {
|
|
return true // 如果能查到 key,说明已经被注销
|
|
}
|
|
|
|
return false
|
|
}
|