@@ -118,6 +118,16 @@ var ErrJWTMissing = echo.NewHTTPError(http.StatusUnauthorized, "missing or malfo
118
118
// ErrJWTInvalid denotes an error raised when JWT token value is invalid or expired
119
119
var ErrJWTInvalid = echo .NewHTTPError (http .StatusUnauthorized , "invalid or expired jwt" )
120
120
121
+ // TokenError is used to return error with error occurred JWT token when processing JWT token
122
+ type TokenError struct {
123
+ Token * jwt.Token
124
+ Err error
125
+ }
126
+
127
+ func (e * TokenError ) Error () string { return e .Err .Error () }
128
+
129
+ func (e * TokenError ) Unwrap () error { return e .Err }
130
+
121
131
// JWT returns a JSON Web Token (JWT) auth middleware.
122
132
//
123
133
// For valid token, it sets the user in context and calls next handler.
@@ -233,9 +243,12 @@ func (config Config) ToMiddleware() (echo.MiddlewareFunc, error) {
233
243
}, nil
234
244
}
235
245
246
+ // defaultKeyFunc creates JWTGo implementation for KeyFunc.
247
+ //
248
+ // error returns TokenError.
236
249
func (config Config ) defaultKeyFunc (token * jwt.Token ) (interface {}, error ) {
237
250
if token .Method .Alg () != config .SigningMethod {
238
- return nil , fmt .Errorf ("unexpected jwt signing method=%v" , token .Header ["alg" ])
251
+ return nil , & TokenError { Token : token , Err : fmt .Errorf ("unexpected jwt signing method=%v" , token .Header ["alg" ])}
239
252
}
240
253
if len (config .SigningKeys ) == 0 {
241
254
return config .SigningKey , nil
@@ -246,17 +259,19 @@ func (config Config) defaultKeyFunc(token *jwt.Token) (interface{}, error) {
246
259
return key , nil
247
260
}
248
261
}
249
- return nil , fmt .Errorf ("unexpected jwt key id=%v" , token .Header ["kid" ])
262
+ return nil , & TokenError { Token : token , Err : fmt .Errorf ("unexpected jwt key id=%v" , token .Header ["kid" ])}
250
263
}
251
264
252
- // defaultParseTokenFunc creates JWTGo implementation for ParseTokenFunc
265
+ // defaultParseTokenFunc creates JWTGo implementation for ParseTokenFunc.
266
+ //
267
+ // error returns TokenError.
253
268
func (config Config ) defaultParseTokenFunc (c echo.Context , auth string ) (interface {}, error ) {
254
269
token , err := jwt .ParseWithClaims (auth , config .NewClaimsFunc (c ), config .KeyFunc )
255
270
if err != nil {
256
- return nil , err
271
+ return nil , & TokenError { Token : token , Err : err }
257
272
}
258
273
if ! token .Valid {
259
- return nil , errors .New ("invalid token" )
274
+ return nil , & TokenError { Token : token , Err : errors .New ("invalid token" )}
260
275
}
261
276
return token , nil
262
277
}
0 commit comments