-
Notifications
You must be signed in to change notification settings - Fork 2
/
token.go
66 lines (55 loc) · 1.41 KB
/
token.go
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
64
65
66
package jwt
import (
"github.com/dgrijalva/jwt-go"
"time"
)
/**
* golang-sample源代码,版权归锦翰科技(深圳)有限公司所有。
* <p>
* 文件名称 : token.go
* 文件路径 :
* 作者 : DavidLiu
× Email: david.liu@ginghan.com
*
* 创建日期 : 2022/5/1 10:21
* 修改历史 : 1. [2022/5/1 10:21] 创建文件 by LongYong
*/
func GenToken(subject string, issuer string, secretKey string, expire time.Duration) string {
signKey := []byte(secretKey)
claims := &jwt.StandardClaims{
Subject: subject,
ExpiresAt: time.Now().Add(expire).Unix(),
Issuer: issuer,
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
ss, err := token.SignedString(signKey)
if err != nil {
return ""
}
return ss
}
type TokenSubjectDecode func(subject string) (any, error)
type TokenInvalidError struct {
}
func (t TokenInvalidError) Error() string {
return "Token is invalid"
}
func CheckToken(secretKey string, tokenStr string, decode TokenSubjectDecode) (any, error) {
if token, err := jwt.ParseWithClaims(tokenStr, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
}); err == nil {
claims := token.Claims.(*jwt.StandardClaims)
if token.Valid {
if decode == nil {
return nil, nil
} else {
subject := claims.Subject
return decode(subject)
}
} else {
return nil, TokenInvalidError{}
}
} else {
return nil, err
}
}