@@ -12,17 +12,25 @@ type Parser struct {
12
12
// If populated, only these methods will be considered valid.
13
13
validMethods []string
14
14
15
- // Use JSON Number format in JSON decoder.
15
+ // Use JSON Number format in JSON decoder. This field is disabled when using a custom json encoder.
16
16
useJSONNumber bool
17
17
18
18
// Skip claims validation during token parsing.
19
19
skipClaimsValidation bool
20
20
21
21
validator * validator
22
22
23
+ // This field is disabled when using a custom base64 encoder.
23
24
decodeStrict bool
24
25
26
+ // This field is disabled when using a custom base64 encoder.
25
27
decodePaddingAllowed bool
28
+
29
+ // Custom base64 encoder.
30
+ base64Encoder Base64Encoder
31
+
32
+ // Custom json encoder.
33
+ jsonEncoder JSONEncoder
26
34
}
27
35
28
36
// NewParser creates a new Parser with the specified options
@@ -135,7 +143,12 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
135
143
}
136
144
return token , parts , newError ("could not base64 decode header" , ErrTokenMalformed , err )
137
145
}
138
- if err = json .Unmarshal (headerBytes , & token .Header ); err != nil {
146
+ if p .jsonEncoder != nil {
147
+ err = p .jsonEncoder .Unmarshal (headerBytes , & token .Header )
148
+ } else {
149
+ err = json .Unmarshal (headerBytes , & token .Header )
150
+ }
151
+ if err != nil {
139
152
return token , parts , newError ("could not JSON decode header" , ErrTokenMalformed , err )
140
153
}
141
154
@@ -146,21 +159,30 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
146
159
if claimBytes , err = p .DecodeSegment (parts [1 ]); err != nil {
147
160
return token , parts , newError ("could not base64 decode claim" , ErrTokenMalformed , err )
148
161
}
149
- dec := json .NewDecoder (bytes .NewBuffer (claimBytes ))
150
- if p .useJSONNumber {
151
- dec .UseNumber ()
152
- }
162
+
153
163
// JSON Decode. Special case for map type to avoid weird pointer behavior
154
- if c , ok := token .Claims .(MapClaims ); ok {
155
- err = dec .Decode (& c )
164
+ mapClaims , isMapClaims := token .Claims .(MapClaims )
165
+ if p .jsonEncoder != nil {
166
+ if isMapClaims {
167
+ err = p .jsonEncoder .Unmarshal (claimBytes , & mapClaims )
168
+ } else {
169
+ err = p .jsonEncoder .Unmarshal (claimBytes , & claims )
170
+ }
156
171
} else {
157
- err = dec .Decode (& claims )
172
+ decoder := json .NewDecoder (bytes .NewBuffer (claimBytes ))
173
+ if p .useJSONNumber {
174
+ decoder .UseNumber ()
175
+ }
176
+ if isMapClaims {
177
+ err = decoder .Decode (& mapClaims )
178
+ } else {
179
+ err = decoder .Decode (& claims )
180
+ }
158
181
}
159
182
// Handle decode error
160
183
if err != nil {
161
184
return token , parts , newError ("could not JSON decode claim" , ErrTokenMalformed , err )
162
185
}
163
-
164
186
// Lookup signature method
165
187
if method , ok := token .Header ["alg" ].(string ); ok {
166
188
if token .Method = GetSigningMethod (method ); token .Method == nil {
@@ -177,6 +199,10 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
177
199
// take into account whether the [Parser] is configured with additional options,
178
200
// such as [WithStrictDecoding] or [WithPaddingAllowed].
179
201
func (p * Parser ) DecodeSegment (seg string ) ([]byte , error ) {
202
+ if p .base64Encoder != nil {
203
+ return p .base64Encoder .DecodeString (seg )
204
+ }
205
+
180
206
encoding := base64 .RawURLEncoding
181
207
182
208
if p .decodePaddingAllowed {
0 commit comments