@@ -65,25 +65,25 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf
65
65
}
66
66
if ! signingMethodValid {
67
67
// signing method is not in the listed set
68
- return token , NewValidationError ( fmt .Sprintf ( " signing method %v is invalid" , alg ), ValidationErrorSignatureInvalid )
68
+ return token , fmt .Errorf ( "%w: signing method %v is invalid" , ErrTokenSignatureInvalid , err )
69
69
}
70
70
}
71
71
72
72
// Lookup key
73
73
var key interface {}
74
74
if keyFunc == nil {
75
75
// keyFunc was not provided. short circuiting validation
76
- return token , NewValidationError ( " no Keyfunc was provided. " , ValidationErrorUnverifiable )
76
+ return token , fmt . Errorf ( "%w: no keyfunc was provided" , ErrTokenUnverifiable )
77
77
}
78
78
if key , err = keyFunc (token ); err != nil {
79
- // keyFunc returned an error
80
- if ve , ok := err .(* ValidationError ); ok {
81
- return token , ve
82
- }
83
- return token , & ValidationError {Inner : err , Errors : ValidationErrorUnverifiable }
79
+ return token , fmt .Errorf ("%w: error while executing keyfunc: %w" , ErrTokenUnverifiable , err )
84
80
}
85
81
86
- vErr := & ValidationError {}
82
+ // Perform signature validation
83
+ token .Signature = parts [2 ]
84
+ if err = token .Method .Verify (strings .Join (parts [0 :2 ], "." ), token .Signature , key ); err != nil {
85
+ return token , fmt .Errorf ("%w: %w" , ErrTokenSignatureInvalid , err )
86
+ }
87
87
88
88
// Validate Claims
89
89
if ! p .skipClaimsValidation {
@@ -93,29 +93,14 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf
93
93
}
94
94
95
95
if err := p .validator .Validate (claims ); err != nil {
96
- // If the Claims Valid returned an error, check if it is a validation error,
97
- // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set
98
- if e , ok := err .(* ValidationError ); ! ok {
99
- vErr = & ValidationError {Inner : err , Errors : ValidationErrorClaimsInvalid }
100
- } else {
101
- vErr = e
102
- }
96
+ return token , err
103
97
}
104
98
}
105
99
106
- // Perform validation
107
- token .Signature = parts [2 ]
108
- if err = token .Method .Verify (strings .Join (parts [0 :2 ], "." ), token .Signature , key ); err != nil {
109
- vErr .Inner = err
110
- vErr .Errors |= ValidationErrorSignatureInvalid
111
- }
112
-
113
- if vErr .valid () {
114
- token .Valid = true
115
- return token , nil
116
- }
100
+ // No errors so far, token is valid.
101
+ token .Valid = true
117
102
118
- return token , vErr
103
+ return token , nil
119
104
}
120
105
121
106
// ParseUnverified parses the token but doesn't validate the signature.
@@ -127,7 +112,7 @@ func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyf
127
112
func (p * Parser ) ParseUnverified (tokenString string , claims Claims ) (token * Token , parts []string , err error ) {
128
113
parts = strings .Split (tokenString , "." )
129
114
if len (parts ) != 3 {
130
- return nil , parts , NewValidationError ( " token contains an invalid number of segments" , ValidationErrorMalformed )
115
+ return nil , parts , fmt . Errorf ( "%w: token contains an invalid number of segments" , ErrTokenMalformed )
131
116
}
132
117
133
118
token = & Token {Raw : tokenString }
@@ -136,20 +121,20 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
136
121
var headerBytes []byte
137
122
if headerBytes , err = DecodeSegment (parts [0 ]); err != nil {
138
123
if strings .HasPrefix (strings .ToLower (tokenString ), "bearer " ) {
139
- return token , parts , NewValidationError ( " tokenstring should not contain 'bearer '" , ValidationErrorMalformed )
124
+ return token , parts , fmt . Errorf ( "%w: tokenstring should not contain 'bearer '" , ErrTokenMalformed )
140
125
}
141
- return token , parts , & ValidationError { Inner : err , Errors : ValidationErrorMalformed }
126
+ return token , parts , fmt . Errorf ( "%w: %w" , ErrTokenMalformed , err )
142
127
}
143
128
if err = json .Unmarshal (headerBytes , & token .Header ); err != nil {
144
- return token , parts , & ValidationError { Inner : err , Errors : ValidationErrorMalformed }
129
+ return token , parts , fmt . Errorf ( "%w: %w" , ErrTokenMalformed , err )
145
130
}
146
131
147
132
// parse Claims
148
133
var claimBytes []byte
149
134
token .Claims = claims
150
135
151
136
if claimBytes , err = DecodeSegment (parts [1 ]); err != nil {
152
- return token , parts , & ValidationError { Inner : err , Errors : ValidationErrorMalformed }
137
+ return token , parts , fmt . Errorf ( "%w: %w" , ErrTokenMalformed , err )
153
138
}
154
139
dec := json .NewDecoder (bytes .NewBuffer (claimBytes ))
155
140
if p .useJSONNumber {
@@ -163,16 +148,16 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
163
148
}
164
149
// Handle decode error
165
150
if err != nil {
166
- return token , parts , & ValidationError { Inner : err , Errors : ValidationErrorMalformed }
151
+ return token , parts , fmt . Errorf ( "%w: %w" , ErrTokenMalformed , err )
167
152
}
168
153
169
154
// Lookup signature method
170
155
if method , ok := token .Header ["alg" ].(string ); ok {
171
156
if token .Method = GetSigningMethod (method ); token .Method == nil {
172
- return token , parts , NewValidationError ( " signing method (alg) is unavailable. " , ValidationErrorUnverifiable )
157
+ return token , parts , fmt . Errorf ( "%w: signing method (alg) is unavailable" , ErrTokenUnverifiable )
173
158
}
174
159
} else {
175
- return token , parts , NewValidationError ( " signing method (alg) is unspecified. " , ValidationErrorUnverifiable )
160
+ return token , parts , fmt . Errorf ( "%w: signing method (alg) is unspecified" , ErrTokenUnverifiable )
176
161
}
177
162
178
163
return token , parts , nil
0 commit comments