You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.5 KiB
Go

package certs
import (
"encoding/json"
"errors"
"github.com/golang-jwt/jwt/v5"
"github.com/rs/xid"
"time"
)
type User struct {
UserId int64 `json:"id"`
jwt.RegisteredClaims
}
func NewUser() *User {
return &User{}
}
// Token 获取token
func (u *User) Token(id int64, username string) (string, error) {
u.UserId = id
u.RegisteredClaims = jwt.RegisteredClaims{
Issuer: issuer,
Subject: username,
ExpiresAt: jwt.NewNumericDate(u.Expired()),
NotBefore: jwt.NewNumericDate(time.Now()),
IssuedAt: jwt.NewNumericDate(time.Now()),
ID: xid.New().String(),
}
var key = randomString(6)
token := jwt.NewWithClaims(jwt.SigningMethodHS256, u)
//加密校验字符串
token.Header[saltKey] = key
token.Header[signKey] = mmd5(key)
return token.SignedString([]byte(key))
}
// Parse 解析token
func (u *User) Parse(tokenString string) (err error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
salt, sign, ok := checkHeaderSign(token.Header)
if !ok || mmd5(salt) != sign {
return nil, errors.New("key invalid")
}
return []byte(salt), nil
})
if err != nil {
return
}
if user, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
b, _ := json.Marshal(user)
_ = json.Unmarshal(b, u)
return
}
if errors.Is(err, jwt.ErrTokenExpired) || errors.Is(err, jwt.ErrTokenNotValidYet) {
return ExpiredErr
}
return InvalidToken
}
func (u *User) Expired() time.Time {
return time.Now().AddDate(0, 0, 7)
}