Skip to content

Commit 59e38b5

Browse files
kingcwappleboy
authored andcommitted
nil check in refreshHandler + refreshHandler code refactoring (#165)
1) added a nil check in refreshHandler to prevent panic when token is nil, this is when there is no JWT in cookie 2) refactored code to new RefreshToken func, for ppl who like to refresh everytime in Authorization or every request 3) refactored code to new CheckIfTokenExpire func, for ppl who like to only check if token is expired in Authorization, mainly for SPA use, one way to refresh is to only refresh on application load
1 parent bfaf3ee commit 59e38b5

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

auth_jwt.go

+32-9
Original file line numberDiff line numberDiff line change
@@ -438,14 +438,20 @@ func (mw *GinJWTMiddleware) signedString(token *jwt.Token) (string, error) {
438438
// Shall be put under an endpoint that is using the GinJWTMiddleware.
439439
// Reply will be of the form {"token": "TOKEN"}.
440440
func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context) {
441-
token, _ := mw.ParseToken(c)
442-
claims := token.Claims.(jwt.MapClaims)
441+
tokenString, expire, err := mw.RefreshToken(c)
442+
if err != nil {
443+
mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c))
444+
return
445+
}
443446

444-
origIat := int64(claims["orig_iat"].(float64))
447+
mw.RefreshResponse(c, http.StatusOK, tokenString, expire)
448+
}
445449

446-
if origIat < mw.TimeFunc().Add(-mw.MaxRefresh).Unix() {
447-
mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrExpiredToken, c))
448-
return
450+
// RefreshToken refresh token and check if token is expired
451+
func (mw *GinJWTMiddleware) RefreshToken(c *gin.Context) (string, time.Time, error) {
452+
claims, err := mw.CheckIfTokenExpire(c)
453+
if err != nil {
454+
return "", time.Now(), ErrExpiredToken
449455
}
450456

451457
// Create the token
@@ -462,8 +468,7 @@ func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context) {
462468
tokenString, err := mw.signedString(newToken)
463469

464470
if err != nil {
465-
mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrFailedTokenCreation, c))
466-
return
471+
return "", time.Now(), err
467472
}
468473

469474
// set cookie
@@ -480,7 +485,25 @@ func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context) {
480485
)
481486
}
482487

483-
mw.RefreshResponse(c, http.StatusOK, tokenString, expire)
488+
return tokenString, expire, nil
489+
}
490+
491+
// CheckIfTokenExpire check if token expire
492+
func (mw *GinJWTMiddleware) CheckIfTokenExpire(c *gin.Context) (jwt.MapClaims, error) {
493+
token, err := mw.ParseToken(c)
494+
if err != nil {
495+
return nil, err
496+
}
497+
498+
claims := token.Claims.(jwt.MapClaims)
499+
500+
origIat := int64(claims["orig_iat"].(float64))
501+
502+
if origIat < mw.TimeFunc().Add(-mw.MaxRefresh).Unix() {
503+
return nil, ErrExpiredToken
504+
}
505+
506+
return claims, nil
484507
}
485508

486509
// TokenGenerator method that clients can use to get a jwt token.

0 commit comments

Comments
 (0)