1
1
package jwt
2
2
3
3
import (
4
- "encoding"
5
4
"encoding/base64"
6
5
"encoding/json"
7
6
)
@@ -19,16 +18,26 @@ type TokenBuilder struct {
19
18
header Header
20
19
}
21
20
21
+ // BinaryMarshaler a marshaling interface for user claims.
22
+ type BinaryMarshaler interface {
23
+ MarshalBinary () (data []byte , err error )
24
+ }
25
+
26
+ // BuildBytes is used to create and encode JWT with a provided claims.
27
+ func BuildBytes (signer Signer , claims BinaryMarshaler ) ([]byte , error ) {
28
+ return NewTokenBuilder (signer ).BuildBytes (claims )
29
+ }
30
+
22
31
// Build is used to create and encode JWT with a provided claims.
23
- func Build (signer Signer , claims encoding. BinaryMarshaler ) (* Token , error ) {
32
+ func Build (signer Signer , claims BinaryMarshaler ) (* Token , error ) {
24
33
return NewTokenBuilder (signer ).Build (claims )
25
34
}
26
35
27
36
// BuildWithHeader is used to create and encode JWT with a provided claims.
28
- func BuildWithHeader (signer Signer , header * Header , claims encoding. BinaryMarshaler ) (* Token , error ) {
37
+ func BuildWithHeader (signer Signer , header Header , claims BinaryMarshaler ) (* Token , error ) {
29
38
b := & TokenBuilder {
30
39
signer : signer ,
31
- header : * header ,
40
+ header : header ,
32
41
}
33
42
return b .Build (claims )
34
43
}
@@ -46,18 +55,26 @@ func NewTokenBuilder(signer Signer) *TokenBuilder {
46
55
return b
47
56
}
48
57
49
- // Build used to create and encode JWT with a provided claims.
50
- func (b * TokenBuilder ) Build (claims encoding.BinaryMarshaler ) (* Token , error ) {
51
- encodedHeader := b .encodeHeader ()
58
+ // BuildBytes used to create and encode JWT with a provided claims.
59
+ func (b * TokenBuilder ) BuildBytes (claims BinaryMarshaler ) ([]byte , error ) {
60
+ token , err := b .Build (claims )
61
+ if err != nil {
62
+ return nil , err
63
+ }
64
+ return token .Raw (), nil
65
+ }
52
66
67
+ // Build used to create and encode JWT with a provided claims.
68
+ func (b * TokenBuilder ) Build (claims BinaryMarshaler ) (* Token , error ) {
53
69
rawClaims , encodedClaims , err := encodeClaims (claims )
54
70
if err != nil {
55
71
return nil , err
56
72
}
57
73
74
+ encodedHeader := encodeHeader (& b .header )
58
75
payload := concatParts (encodedHeader , encodedClaims )
59
76
60
- signed , signature , err := b . signPayload (payload )
77
+ signed , signature , err := signPayload (b . signer , payload )
61
78
if err != nil {
62
79
return nil , err
63
80
}
@@ -72,55 +89,57 @@ func (b *TokenBuilder) Build(claims encoding.BinaryMarshaler) (*Token, error) {
72
89
return token , nil
73
90
}
74
91
75
- func (b * TokenBuilder ) encodeHeader () []byte {
76
- switch b .signer .Algorithm () {
77
- case NoEncryption :
78
- return []byte ("eyJhbGciOiJub25lIn0" )
79
- case EdDSA :
80
- return []byte ("eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9" )
81
-
82
- case HS256 :
83
- return []byte ("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" )
84
- case HS384 :
85
- return []byte ("eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9" )
86
- case HS512 :
87
- return []byte ("eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9" )
88
-
89
- case RS256 :
90
- return []byte ("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9" )
91
- case RS384 :
92
- return []byte ("eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9" )
93
- case RS512 :
94
- return []byte ("eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9" )
95
-
96
- case ES256 :
97
- return []byte ("eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9" )
98
- case ES384 :
99
- return []byte ("eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9" )
100
- case ES512 :
101
- return []byte ("eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9" )
102
-
103
- case PS256 :
104
- return []byte ("eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9" )
105
- case PS384 :
106
- return []byte ("eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9" )
107
- case PS512 :
108
- return []byte ("eyJhbGciOiJQUzUxMiIsInR5cCI6IkpXVCJ9" )
109
-
110
- default :
111
- // another algorithm? encode below
92
+ func encodeHeader (header * Header ) []byte {
93
+ if header .Type == "JWT" {
94
+ switch header .Algorithm {
95
+ case NoEncryption :
96
+ return []byte ("eyJhbGciOiJub25lIn0" )
97
+ case EdDSA :
98
+ return []byte ("eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9" )
99
+
100
+ case HS256 :
101
+ return []byte ("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" )
102
+ case HS384 :
103
+ return []byte ("eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9" )
104
+ case HS512 :
105
+ return []byte ("eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9" )
106
+
107
+ case RS256 :
108
+ return []byte ("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9" )
109
+ case RS384 :
110
+ return []byte ("eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9" )
111
+ case RS512 :
112
+ return []byte ("eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9" )
113
+
114
+ case ES256 :
115
+ return []byte ("eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9" )
116
+ case ES384 :
117
+ return []byte ("eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9" )
118
+ case ES512 :
119
+ return []byte ("eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9" )
120
+
121
+ case PS256 :
122
+ return []byte ("eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9" )
123
+ case PS384 :
124
+ return []byte ("eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9" )
125
+ case PS512 :
126
+ return []byte ("eyJhbGciOiJQUzUxMiIsInR5cCI6IkpXVCJ9" )
127
+
128
+ default :
129
+ // another algorithm? encode below
130
+ }
112
131
}
113
132
114
133
// returned err is always nil, see *Header.MarshalJSON
115
- buf , _ := json .Marshal (b . header )
134
+ buf , _ := json .Marshal (header )
116
135
117
136
encoded := make ([]byte , base64EncodedLen (len (buf )))
118
137
base64Encode (encoded , buf )
119
138
120
139
return encoded
121
140
}
122
141
123
- func encodeClaims (claims encoding. BinaryMarshaler ) (raw , encoded []byte , err error ) {
142
+ func encodeClaims (claims BinaryMarshaler ) (raw , encoded []byte , err error ) {
124
143
raw , err = claims .MarshalBinary ()
125
144
if err != nil {
126
145
return nil , nil , err
@@ -132,8 +151,8 @@ func encodeClaims(claims encoding.BinaryMarshaler) (raw, encoded []byte, err err
132
151
return raw , encoded , nil
133
152
}
134
153
135
- func ( b * TokenBuilder ) signPayload ( payload []byte ) (signed , signature []byte , err error ) {
136
- signature , err = b . signer .Sign (payload )
154
+ func signPayload ( signer Signer , payload []byte ) (signed , signature []byte , err error ) {
155
+ signature , err = signer .Sign (payload )
137
156
if err != nil {
138
157
return nil , nil , err
139
158
}
0 commit comments