mirror of
https://github.com/ProudMuBai/GoFilm.git
synced 2026-02-04 06:54:41 +08:00
90 lines
2.4 KiB
Go
90 lines
2.4 KiB
Go
package system
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/golang-jwt/jwt/v5"
|
|
"log"
|
|
"server/config"
|
|
"server/plugin/common/util"
|
|
"server/plugin/db"
|
|
"time"
|
|
)
|
|
|
|
type UserClaims struct {
|
|
UserID uint `json:"userID"`
|
|
UserName string `json:"userName"`
|
|
jwt.RegisteredClaims
|
|
}
|
|
|
|
// GenToken 生成token
|
|
func GenToken(userId uint, userName string) (string, error) {
|
|
uc := UserClaims{
|
|
UserID: userId,
|
|
UserName: userName,
|
|
RegisteredClaims: jwt.RegisteredClaims{
|
|
Issuer: config.Issuer,
|
|
Subject: userName,
|
|
Audience: jwt.ClaimStrings{"Auth_All"},
|
|
ExpiresAt: jwt.NewNumericDate(time.Now().Add(config.AuthTokenExpires * time.Hour)),
|
|
NotBefore: jwt.NewNumericDate(time.Now().Add(-10 * time.Second)),
|
|
IssuedAt: jwt.NewNumericDate(time.Now()),
|
|
ID: util.GenerateSalt(),
|
|
},
|
|
}
|
|
priKey, err := util.ParsePriKeyBytes([]byte(config.PrivateKey))
|
|
token, err := jwt.NewWithClaims(jwt.SigningMethodRS256, uc).SignedString(priKey)
|
|
return token, err
|
|
}
|
|
|
|
// ParseToken 解析token
|
|
func ParseToken(tokenStr string) (*UserClaims, error) {
|
|
token, err := jwt.ParseWithClaims(tokenStr, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {
|
|
pub, err := util.ParsePubKeyBytes([]byte(config.PublicKey))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return pub, nil
|
|
})
|
|
if err != nil {
|
|
if errors.Is(err, jwt.ErrTokenExpired) {
|
|
claims, _ := token.Claims.(*UserClaims)
|
|
return claims, err
|
|
}
|
|
return nil, err
|
|
}
|
|
// 验证token是否有效
|
|
if !token.Valid {
|
|
return nil, errors.New("token is invalid")
|
|
}
|
|
// 解析token中的claims内容
|
|
claims, ok := token.Claims.(*UserClaims)
|
|
if !ok {
|
|
return nil, errors.New("invalid claim type error")
|
|
}
|
|
return claims, err
|
|
}
|
|
|
|
// RefreshToken 刷新 token
|
|
|
|
// SaveUserToken 将用户登录成功后的token字符串存放到redis中
|
|
func SaveUserToken(token string, userId uint) error {
|
|
// 设置redis中token的过期时间为 token过期时间后的7天
|
|
return db.Rdb.Set(db.Cxt, fmt.Sprintf(config.UserTokenKey, userId), token, (config.AuthTokenExpires+7*24)*time.Hour).Err()
|
|
}
|
|
|
|
// GetUserTokenById 从redis中获取指定userId对应的token
|
|
func GetUserTokenById(userId uint) string {
|
|
token, err := db.Rdb.Get(db.Cxt, fmt.Sprintf(config.UserTokenKey, userId)).Result()
|
|
if err != nil {
|
|
log.Println(err)
|
|
return ""
|
|
}
|
|
return token
|
|
}
|
|
|
|
// ClearUserToken 清楚指定id的用户的登录信息
|
|
func ClearUserToken(userId uint) error {
|
|
return db.Rdb.Del(db.Cxt, fmt.Sprintf(config.UserTokenKey, userId)).Err()
|
|
}
|