53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/golang-jwt/jwt/v5"
|
|
"time"
|
|
"vote-video-api/config"
|
|
)
|
|
|
|
type Token struct {
|
|
UserId string `json:"user_id"` // 用户id
|
|
jwt.RegisteredClaims // v5版本新加的方法
|
|
}
|
|
|
|
// NewJWT GenerateJWT 生成JWT
|
|
func (t Token) NewJWT() (string, error) {
|
|
now := time.Now()
|
|
year, month, day := now.Date()
|
|
location := now.Location()
|
|
validTime := time.Date(year, month, day, 23, 59, 59, 0, location)
|
|
duration := validTime.Sub(now)
|
|
if duration < 0 {
|
|
return "", errors.New("登录失败")
|
|
}
|
|
|
|
if config.C.Env == "dev" {
|
|
duration = 5 * time.Minute
|
|
}
|
|
|
|
t.RegisteredClaims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(duration)) // 过期时间24小时
|
|
t.RegisteredClaims.IssuedAt = jwt.NewNumericDate(time.Now()) // 签发时间
|
|
t.RegisteredClaims.NotBefore = jwt.NewNumericDate(time.Now()) // 生效时间
|
|
|
|
// 使用HS256签名算法
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, t)
|
|
s, err := token.SignedString([]byte(config.C.Jwt.SignKey))
|
|
|
|
return s, err
|
|
}
|
|
|
|
// ParseJwt 解析JWT
|
|
func ParseJwt(authorization string) (*Token, error) {
|
|
t, err := jwt.ParseWithClaims(authorization, &Token{}, func(token *jwt.Token) (interface{}, error) {
|
|
return []byte(config.C.Jwt.SignKey), nil
|
|
})
|
|
|
|
if claims, ok := t.Claims.(*Token); ok && t.Valid {
|
|
return claims, nil
|
|
} else {
|
|
return nil, err
|
|
}
|
|
}
|