zhangqian
2024-03-23 b68185aed1a86536b01fdfbca6b2cca7bd71a50f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package jwt
 
import (
    "errors"
    "github.com/dgrijalva/jwt-go"
)
 
type JWT struct {
    SigningKey []byte
}
 
var (
    TokenExpired     = errors.New("Token is expired")
    TokenNotValidYet = errors.New("Token not active yet")
    TokenMalformed   = errors.New("That's not even a token")
    TokenInvalid     = errors.New("Couldn't handle this token:")
)
 
type OutSideJWT struct {
    SigningKey []byte
}
 
func NewOutsideJWT(signKey string) *OutSideJWT {
    return &OutSideJWT{
        []byte(signKey),
    }
}
 
// CreateToken 创建一个token
func (j *OutSideJWT) CreateToken(claims OutsideUserClaims) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString(j.SigningKey)
}
 
// ParseToken 解析token
func (j *OutSideJWT) ParseToken(tokenString string) (*OutsideUserClaims, error) {
    token, err := jwt.ParseWithClaims(tokenString, &OutsideUserClaims{}, func(token *jwt.Token) (i interface{}, e error) {
        return j.SigningKey, nil
    })
    if err != nil {
        if ve, ok := err.(*jwt.ValidationError); ok {
            if ve.Errors&jwt.ValidationErrorMalformed != 0 {
                return nil, TokenMalformed
            } else if ve.Errors&jwt.ValidationErrorExpired != 0 {
                // Token is expired
                return nil, TokenExpired
            } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
                return nil, TokenNotValidYet
            } else {
                return nil, TokenInvalid
            }
        }
    }
    if token != nil {
        if claims, ok := token.Claims.(*OutsideUserClaims); ok && token.Valid {
            return claims, nil
        }
        return nil, TokenInvalid
 
    } else {
        return nil, TokenInvalid
    }
}