Skip to content

Commit 1f68bd7

Browse files
lansi951aldas
authored andcommitted
add TokenError
1 parent e2bd7f8 commit 1f68bd7

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

jwt.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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
119119
var 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.
236249
func (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.
253268
func (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

Comments
 (0)