Files
GoFilm/server/model/system/Jwt.go
2023-12-23 22:32:52 +08:00

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()
}