mirror of
https://github.com/ProudMuBai/GoFilm.git
synced 2026-03-13 01:17:31 +08:00
add BAM
This commit is contained in:
89
server/model/system/Jwt.go
Normal file
89
server/model/system/Jwt.go
Normal file
@@ -0,0 +1,89 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user