...
1 package jwt
2
3 import (
4 "encoding/base64"
5 "encoding/json"
6 "strings"
7 "time"
8 )
9
10
11
12
13 var TimeFunc = time.Now
14
15
16
17
18
19 type Keyfunc func(*Token) (interface{}, error)
20
21
22
23 type Token struct {
24 Raw string
25 Method SigningMethod
26 Header map[string]interface{}
27 Claims Claims
28 Signature string
29 Valid bool
30 }
31
32
33 func New(method SigningMethod) *Token {
34 return NewWithClaims(method, MapClaims{})
35 }
36
37 func NewWithClaims(method SigningMethod, claims Claims) *Token {
38 return &Token{
39 Header: map[string]interface{}{
40 "typ": "JWT",
41 "alg": method.Alg(),
42 },
43 Claims: claims,
44 Method: method,
45 }
46 }
47
48
49 func (t *Token) SignedString(key interface{}) (string, error) {
50 var sig, sstr string
51 var err error
52 if sstr, err = t.SigningString(); err != nil {
53 return "", err
54 }
55 if sig, err = t.Method.Sign(sstr, key); err != nil {
56 return "", err
57 }
58 return strings.Join([]string{sstr, sig}, "."), nil
59 }
60
61
62
63
64
65 func (t *Token) SigningString() (string, error) {
66 var err error
67 parts := make([]string, 2)
68 for i := range parts {
69 var jsonValue []byte
70 if i == 0 {
71 if jsonValue, err = json.Marshal(t.Header); err != nil {
72 return "", err
73 }
74 } else {
75 if jsonValue, err = json.Marshal(t.Claims); err != nil {
76 return "", err
77 }
78 }
79
80 parts[i] = EncodeSegment(jsonValue)
81 }
82 return strings.Join(parts, "."), nil
83 }
84
85
86
87
88 func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {
89 return new(Parser).Parse(tokenString, keyFunc)
90 }
91
92 func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) {
93 return new(Parser).ParseWithClaims(tokenString, claims, keyFunc)
94 }
95
96
97 func EncodeSegment(seg []byte) string {
98 return base64.RawURLEncoding.EncodeToString(seg)
99 }
100
101
102 func DecodeSegment(seg string) ([]byte, error) {
103 return base64.RawURLEncoding.DecodeString(seg)
104 }
105
View as plain text