From 77332448e640172dc802f21e1450532b86b7a1e5 Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Fri, 9 Sep 2022 09:32:21 +0800 Subject: [PATCH] feat(jwt): adds ParseOption to Parse method of jwt (#303) --- auth_jwt.go | 20 +++++++++++--------- auth_jwt_test.go | 6 +++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/auth_jwt.go b/auth_jwt.go index edeebdd..804a334 100644 --- a/auth_jwt.go +++ b/auth_jwt.go @@ -3,8 +3,8 @@ package jwt import ( "crypto/rsa" "errors" - "io/ioutil" "net/http" + "os" "strings" "time" @@ -151,6 +151,9 @@ type GinJWTMiddleware struct { // CookieSameSite allow use http.SameSite cookie param CookieSameSite http.SameSite + + // ParseOptions allow to modify jwt's parser methods + ParseOptions []jwt.ParserOption } var ( @@ -229,7 +232,7 @@ func (mw *GinJWTMiddleware) readKeys() error { if err != nil { return err } - jwt.WithoutClaimsValidation() + err = mw.publicKey() if err != nil { return err @@ -242,7 +245,7 @@ func (mw *GinJWTMiddleware) privateKey() error { if mw.PrivKeyFile == "" { keyData = mw.PrivKeyBytes } else { - filecontent, err := ioutil.ReadFile(mw.PrivKeyFile) + filecontent, err := os.ReadFile(mw.PrivKeyFile) if err != nil { return ErrNoPrivKeyFile } @@ -256,7 +259,6 @@ func (mw *GinJWTMiddleware) privateKey() error { return ErrInvalidPrivKey } mw.privKey = key - jwt.WithJSONNumber() return nil } @@ -273,7 +275,7 @@ func (mw *GinJWTMiddleware) publicKey() error { if mw.PubKeyFile == "" { keyData = mw.PubKeyBytes } else { - filecontent, err := ioutil.ReadFile(mw.PubKeyFile) + filecontent, err := os.ReadFile(mw.PubKeyFile) if err != nil { return ErrNoPubKeyFile } @@ -755,7 +757,7 @@ func (mw *GinJWTMiddleware) ParseToken(c *gin.Context) (*jwt.Token, error) { } if mw.KeyFunc != nil { - return jwt.Parse(token, mw.KeyFunc) + return jwt.Parse(token, mw.KeyFunc, mw.ParseOptions...) } return jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { @@ -770,13 +772,13 @@ func (mw *GinJWTMiddleware) ParseToken(c *gin.Context) (*jwt.Token, error) { c.Set("JWT_TOKEN", token) return mw.Key, nil - }) + }, mw.ParseOptions...) } // ParseTokenString parse jwt token string func (mw *GinJWTMiddleware) ParseTokenString(token string) (*jwt.Token, error) { if mw.KeyFunc != nil { - return jwt.Parse(token, mw.KeyFunc) + return jwt.Parse(token, mw.KeyFunc, mw.ParseOptions...) } return jwt.Parse(token, func(t *jwt.Token) (interface{}, error) { @@ -788,7 +790,7 @@ func (mw *GinJWTMiddleware) ParseTokenString(token string) (*jwt.Token, error) { } return mw.Key, nil - }) + }, mw.ParseOptions...) } func (mw *GinJWTMiddleware) unauthorized(c *gin.Context, code int, message string) { diff --git a/auth_jwt_test.go b/auth_jwt_test.go index 8e9ea4a..a753036 100644 --- a/auth_jwt_test.go +++ b/auth_jwt_test.go @@ -3,9 +3,9 @@ package jwt import ( "errors" "fmt" - "io/ioutil" "log" "net/http" + "os" "reflect" "strings" "testing" @@ -51,7 +51,7 @@ func makeTokenString(SigningAlgorithm string, username string) string { claims["orig_iat"] = time.Now().Unix() var tokenString string if SigningAlgorithm == "RS256" { - keyData, _ := ioutil.ReadFile("testdata/jwtRS256.key") + keyData, _ := os.ReadFile("testdata/jwtRS256.key") signKey, _ := jwt.ParseRSAPrivateKeyFromPEM(keyData) tokenString, _ = token.SignedString(signKey) } else { @@ -62,7 +62,7 @@ func makeTokenString(SigningAlgorithm string, username string) string { } func keyFunc(token *jwt.Token) (interface{}, error) { - cert, err := ioutil.ReadFile("testdata/jwtRS256.key.pub") + cert, err := os.ReadFile("testdata/jwtRS256.key.pub") if err != nil { return nil, err }