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