init
This commit is contained in:
115
myJwt/jwt.go
Normal file
115
myJwt/jwt.go
Normal file
@ -0,0 +1,115 @@
|
||||
package myJwt
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Claims struct {
|
||||
UserId int `json:"uid"`
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
func (t Claims) toSimpleJwt() *SimpleJwt {
|
||||
return &SimpleJwt{
|
||||
Audience: t.Audience,
|
||||
ExpiresAt: t.ExpiresAt,
|
||||
Id: t.ID,
|
||||
IssuedAt: t.IssuedAt,
|
||||
Issuer: t.Issuer,
|
||||
NotBefore: t.NotBefore,
|
||||
Subject: t.Subject,
|
||||
userId: t.UserId,
|
||||
jwtSecret: "",
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
type SimpleJwt struct {
|
||||
Audience jwt.ClaimStrings
|
||||
ExpiresAt *jwt.NumericDate
|
||||
Id string
|
||||
IssuedAt *jwt.NumericDate
|
||||
Issuer string
|
||||
NotBefore *jwt.NumericDate
|
||||
Subject string
|
||||
|
||||
userId int
|
||||
jwtSecret string
|
||||
}
|
||||
|
||||
func NewSimpleJwt(userId int, jwtSecret string) *SimpleJwt {
|
||||
return &SimpleJwt{
|
||||
userId: userId,
|
||||
jwtSecret: jwtSecret,
|
||||
|
||||
ExpiresAt: jwt.NewNumericDate(time.Now().Add(90 * 24 * time.Hour)),
|
||||
Issuer: "zhecent",
|
||||
}
|
||||
}
|
||||
|
||||
func (t *SimpleJwt) SetExpiresAt(expiresAt time.Time) {
|
||||
t.ExpiresAt = jwt.NewNumericDate(expiresAt)
|
||||
}
|
||||
|
||||
func (t *SimpleJwt) makeClaims() Claims {
|
||||
return Claims{
|
||||
UserId: t.userId,
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ExpiresAt: t.ExpiresAt,
|
||||
Issuer: t.Issuer,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (t *SimpleJwt) GetUserId() int {
|
||||
return t.userId
|
||||
}
|
||||
|
||||
func (t *SimpleJwt) GenerateToken() (string, error) {
|
||||
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, t.makeClaims())
|
||||
token, err := tokenClaims.SignedString([]byte(t.jwtSecret))
|
||||
return token, err
|
||||
}
|
||||
|
||||
func (t *SimpleJwt) MustGenerateToken() string {
|
||||
s, e := t.GenerateToken()
|
||||
if e != nil {
|
||||
panic(e.Error())
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func ParseToken(token string, jwtSecret string) (*SimpleJwt, error) {
|
||||
tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(jwtSecret), nil
|
||||
})
|
||||
|
||||
if tokenClaims != nil {
|
||||
if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
|
||||
return claims.toSimpleJwt(), nil
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case errors.Is(err, jwt.ErrTokenMalformed):
|
||||
return nil, errors.New("that's not even a token")
|
||||
case errors.Is(err, jwt.ErrTokenSignatureInvalid):
|
||||
// Invalid signature
|
||||
return nil, errors.New("invalid signature")
|
||||
case errors.Is(err, jwt.ErrTokenExpired) || errors.Is(err, jwt.ErrTokenNotValidYet):
|
||||
// Token is either expired or not active yet
|
||||
return nil, errors.New("timing is everything")
|
||||
default:
|
||||
return nil, errors.New("token校验失败")
|
||||
}
|
||||
}
|
||||
|
||||
func MustParseToken(token string, jwtSecret string) *SimpleJwt {
|
||||
s, e := ParseToken(token, jwtSecret)
|
||||
if e != nil {
|
||||
panic(e.Error())
|
||||
}
|
||||
return s
|
||||
}
|
Reference in New Issue
Block a user