@@ -12,7 +12,7 @@ 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. This field is disabled when using a custom json encoder.
15
+ // Use JSON Number format in JSON decoder.
16
16
useJSONNumber bool
17
17
18
18
// Skip claims validation during token parsing.
@@ -24,8 +24,9 @@ type Parser struct {
24
24
}
25
25
26
26
type decoders struct {
27
- jsonUnmarshal JSONUnmarshalFunc
28
- base64Decode Base64DecodeFunc
27
+ jsonUnmarshal JSONUnmarshalFunc
28
+ jsonNewDecoder JSONNewDecoderFunc [JSONDecoder ]
29
+ base64Decode Base64DecodeFunc
29
30
30
31
// This field is disabled when using a custom base64 encoder.
31
32
decodeStrict bool
@@ -180,12 +181,20 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
180
181
return token , parts , newError ("could not base64 decode claim" , ErrTokenMalformed , err )
181
182
}
182
183
183
- // If `useJSONNumber` is enabled, then we must use *json.Decoder to decode
184
- // the claims. However, this comes with a performance penalty so only use
185
- // it if we must and, otherwise, simple use our existing unmarshal function.
184
+ // If `useJSONNumber` is enabled, then we must use a dedicated JSONDecoder
185
+ // to decode the claims. However, this comes with a performance penalty so
186
+ // only use it if we must and, otherwise, simple use our existing unmarshal
187
+ // function.
186
188
if p .useJSONNumber {
187
189
unmarshal = func (data []byte , v any ) error {
188
- decoder := json .NewDecoder (bytes .NewBuffer (claimBytes ))
190
+ buffer := bytes .NewBuffer (claimBytes )
191
+
192
+ var decoder JSONDecoder
193
+ if p .jsonNewDecoder != nil {
194
+ decoder = p .jsonNewDecoder (buffer )
195
+ } else {
196
+ decoder = json .NewDecoder (buffer )
197
+ }
189
198
decoder .UseNumber ()
190
199
return decoder .Decode (v )
191
200
}
0 commit comments