@@ -118,6 +118,16 @@ var ErrJWTMissing = echo.NewHTTPError(http.StatusUnauthorized, "missing or malfo
118118// ErrJWTInvalid denotes an error raised when JWT token value is invalid or expired
119119var ErrJWTInvalid = echo .NewHTTPError (http .StatusUnauthorized , "invalid or expired jwt" )
120120
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+
121131// JWT returns a JSON Web Token (JWT) auth middleware.
122132//
123133// For valid token, it sets the user in context and calls next handler.
@@ -233,9 +243,12 @@ func (config Config) ToMiddleware() (echo.MiddlewareFunc, error) {
233243 }, nil
234244}
235245
246+ // defaultKeyFunc creates JWTGo implementation for KeyFunc.
247+ //
248+ // error returns TokenError.
236249func (config Config ) defaultKeyFunc (token * jwt.Token ) (interface {}, error ) {
237250 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" ])}
239252 }
240253 if len (config .SigningKeys ) == 0 {
241254 return config .SigningKey , nil
@@ -246,17 +259,19 @@ func (config Config) defaultKeyFunc(token *jwt.Token) (interface{}, error) {
246259 return key , nil
247260 }
248261 }
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" ])}
250263}
251264
252- // defaultParseTokenFunc creates JWTGo implementation for ParseTokenFunc
265+ // defaultParseTokenFunc creates JWTGo implementation for ParseTokenFunc.
266+ //
267+ // error returns TokenError.
253268func (config Config ) defaultParseTokenFunc (c echo.Context , auth string ) (interface {}, error ) {
254269 token , err := jwt .ParseWithClaims (auth , config .NewClaimsFunc (c ), config .KeyFunc )
255270 if err != nil {
256- return nil , err
271+ return nil , & TokenError { Token : token , Err : err }
257272 }
258273 if ! token .Valid {
259- return nil , errors .New ("invalid token" )
274+ return nil , & TokenError { Token : token , Err : errors .New ("invalid token" )}
260275 }
261276 return token , nil
262277}
0 commit comments