This repository has been archived by the owner on Oct 5, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
jwt.go
109 lines (90 loc) · 1.8 KB
/
jwt.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package token
import (
"fmt"
jwt "github.com/dgrijalva/jwt-go"
)
var (
key []byte
method = jwt.SigningMethodHS512
issuer string
)
// -
const (
UserClaimsType = "Claims"
UserMapsType = "Maps"
)
// JWT -
type JWT interface {
Create(body interface{}) JWT
Parse(token string, body interface{}) JWT
Error() error
Valid() error
Get() string
}
type jt struct {
t *jwt.Token
jwt string
err error
}
// NewJWT -
func NewJWT() JWT {
return new(jt)
}
// SetKey -
func SetKey(skey string) {
key = []byte(skey)
}
// SetIssuer -
func SetIssuer(iss string) {
issuer = iss
}
func (j *jt) Create(body interface{}) JWT {
switch body.(type) {
case jwt.MapClaims:
j.t = jwt.NewWithClaims(method, body.(jwt.MapClaims))
case jwt.Claims:
j.t = jwt.NewWithClaims(method, body.(jwt.Claims))
default:
j.err = fmt.Errorf("wrong data type , need (JwtMap / JwtClaims)")
}
j.jwt, j.err = j.t.SignedString(key)
return j
}
func (j *jt) Parse(token string, body interface{}) JWT {
j.t, j.err = jwt.ParseWithClaims(token, body.(jwt.Claims), keyLookup)
if j.err == nil {
j.err = j.Valid()
}
return j
}
func (j *jt) Valid() error {
switch j.t.Claims.(type) {
case jwt.MapClaims:
t := j.t.Claims.(jwt.MapClaims)
if !t.VerifyIssuer(issuer, true) {
return fmt.Errorf("the issuer is not %v", issuer)
}
if t.Valid() != nil {
return fmt.Errorf("valid token failed")
}
case jwt.Claims:
if j.t.Claims.Valid() != nil {
return fmt.Errorf("valid token failed")
}
default:
return fmt.Errorf("valid token failed")
}
return nil
}
func (j *jt) Error() error {
return j.err
}
func (j *jt) Get() string {
return j.jwt
}
func keyLookup(t *jwt.Token) (interface{}, error) {
if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("jwt signature method faile")
}
return key, nil
}