Skip to content

Commit ca1084e

Browse files
authored
fix: Prevent panic when exp claim is empty or a string (#193)
fix #192
1 parent b094692 commit ca1084e

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

auth_jwt.go

+16
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ var (
152152
// ErrEmptyAuthHeader can be thrown if authing with a HTTP header, the Auth header needs to be set
153153
ErrEmptyAuthHeader = errors.New("auth header is empty")
154154

155+
// ErrMissingExpField missing exp field in token
156+
ErrMissingExpField = errors.New("missing exp field")
157+
158+
// ErrWrongFormatOfExp field must be float64 format
159+
ErrWrongFormatOfExp = errors.New("exp must be float64 format")
160+
155161
// ErrInvalidAuthHeader indicates auth header is invalid, could for example have the wrong Realm name
156162
ErrInvalidAuthHeader = errors.New("auth header is invalid")
157163

@@ -346,6 +352,16 @@ func (mw *GinJWTMiddleware) middlewareImpl(c *gin.Context) {
346352
return
347353
}
348354

355+
if claims["exp"] == nil {
356+
mw.unauthorized(c, http.StatusBadRequest, mw.HTTPStatusMessageFunc(ErrMissingExpField, c))
357+
return
358+
}
359+
360+
if _, ok := claims["exp"].(float64); !ok {
361+
mw.unauthorized(c, http.StatusBadRequest, mw.HTTPStatusMessageFunc(ErrWrongFormatOfExp, c))
362+
return
363+
}
364+
349365
if int64(claims["exp"].(float64)) < mw.TimeFunc().Unix() {
350366
mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrExpiredToken, c))
351367
return

auth_jwt_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -1094,3 +1094,49 @@ func TestBadTokenOnRefreshHandler(t *testing.T) {
10941094
assert.Equal(t, http.StatusUnauthorized, r.Code)
10951095
})
10961096
}
1097+
1098+
func TestExpiredField(t *testing.T) {
1099+
// the middleware to test
1100+
authMiddleware, _ := New(&GinJWTMiddleware{
1101+
Realm: "test zone",
1102+
Key: key,
1103+
Timeout: time.Hour,
1104+
Authenticator: defaultAuthenticator,
1105+
})
1106+
1107+
handler := ginHandler(authMiddleware)
1108+
1109+
r := gofight.New()
1110+
1111+
token := jwt.New(jwt.GetSigningMethod("HS256"))
1112+
claims := token.Claims.(jwt.MapClaims)
1113+
claims["identity"] = "admin"
1114+
claims["orig_iat"] = 0
1115+
tokenString, _ := token.SignedString(key)
1116+
1117+
r.GET("/auth/hello").
1118+
SetHeader(gofight.H{
1119+
"Authorization": "Bearer " + tokenString,
1120+
}).
1121+
Run(handler, func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {
1122+
message := gjson.Get(r.Body.String(), "message")
1123+
1124+
assert.Equal(t, ErrMissingExpField.Error(), message.String())
1125+
assert.Equal(t, http.StatusBadRequest, r.Code)
1126+
})
1127+
1128+
// wrong format
1129+
claims["exp"] = "test"
1130+
tokenString, _ = token.SignedString(key)
1131+
1132+
r.GET("/auth/hello").
1133+
SetHeader(gofight.H{
1134+
"Authorization": "Bearer " + tokenString,
1135+
}).
1136+
Run(handler, func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {
1137+
message := gjson.Get(r.Body.String(), "message")
1138+
1139+
assert.Equal(t, ErrWrongFormatOfExp.Error(), message.String())
1140+
assert.Equal(t, http.StatusBadRequest, r.Code)
1141+
})
1142+
}

0 commit comments

Comments
 (0)