From bb0fe4d6d8e19f77ecb8f520540553a120bf9682 Mon Sep 17 00:00:00 2001 From: hyeonjae Date: Mon, 12 Jul 2021 23:18:09 +0900 Subject: [PATCH 1/3] remove unnecessary for loop in token signing string for readability - add testcase - add benchmark - improve performance slightly --- token.go | 27 ++++++++---------- token_test.go | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 token_test.go diff --git a/token.go b/token.go index 99868d29..97695b14 100644 --- a/token.go +++ b/token.go @@ -64,22 +64,19 @@ func (t *Token) SignedString(key interface{}) (string, error) { // the SignedString. func (t *Token) SigningString() (string, error) { var err error - parts := make([]string, 2) - for i := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } - - parts[i] = EncodeSegment(jsonValue) + var jsonValue []byte + + if jsonValue, err = json.Marshal(t.Header); err != nil { + return "", err + } + header := EncodeSegment(jsonValue) + + if jsonValue, err = json.Marshal(t.Claims); err != nil { + return "", err } - return strings.Join(parts, "."), nil + claim := EncodeSegment(jsonValue) + + return strings.Join([]string{header, claim}, "."), nil } // Parse, validate, and return a token. diff --git a/token_test.go b/token_test.go new file mode 100644 index 00000000..9ded6252 --- /dev/null +++ b/token_test.go @@ -0,0 +1,77 @@ +package jwt_test + +import ( + "testing" + + "github.com/golang-jwt/jwt" +) + +func TestToken_SigningString(t1 *testing.T) { + type fields struct { + Raw string + Method jwt.SigningMethod + Header map[string]interface{} + Claims jwt.Claims + Signature string + Valid bool + } + tests := []struct { + name string + fields fields + want string + wantErr bool + }{ + { + name: "", + fields: fields{ + Raw: "", + Method: jwt.SigningMethodHS256, + Header: map[string]interface{}{ + "typ": "JWT", + "alg": jwt.SigningMethodHS256.Alg(), + }, + Claims: jwt.StandardClaims{}, + Signature: "", + Valid: false, + }, + want: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30", + wantErr: false, + }, + } + for _, tt := range tests { + t1.Run(tt.name, func(t1 *testing.T) { + t := &jwt.Token{ + Raw: tt.fields.Raw, + Method: tt.fields.Method, + Header: tt.fields.Header, + Claims: tt.fields.Claims, + Signature: tt.fields.Signature, + Valid: tt.fields.Valid, + } + got, err := t.SigningString() + if (err != nil) != tt.wantErr { + t1.Errorf("SigningString() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t1.Errorf("SigningString() got = %v, want %v", got, tt.want) + } + }) + } +} + +func BenchmarkToken_SigningString(b *testing.B) { + t := &jwt.Token{ + Method: jwt.SigningMethodHS256, + Header: map[string]interface{}{ + "typ": "JWT", + "alg": jwt.SigningMethodHS256.Alg(), + }, + Claims: jwt.StandardClaims{}, + } + b.Run("BenchmarkToken_SigningString", func(b *testing.B) { + for i := 0; i Date: Sun, 16 Jan 2022 17:12:43 -0300 Subject: [PATCH 2/3] Fix benchtests on token_test.go --- token_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/token_test.go b/token_test.go index 9ded6252..3e8554db 100644 --- a/token_test.go +++ b/token_test.go @@ -70,6 +70,8 @@ func BenchmarkToken_SigningString(b *testing.B) { Claims: jwt.StandardClaims{}, } b.Run("BenchmarkToken_SigningString", func(b *testing.B) { + b.ResetTimer() + b.ReportAllocs() for i := 0; i Date: Sun, 16 Jan 2022 17:24:17 -0300 Subject: [PATCH 3/3] Update token_test.go to v4 --- token_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/token_test.go b/token_test.go index 3e8554db..7944b51e 100644 --- a/token_test.go +++ b/token_test.go @@ -3,7 +3,7 @@ package jwt_test import ( "testing" - "github.com/golang-jwt/jwt" + "github.com/golang-jwt/jwt/v4" ) func TestToken_SigningString(t1 *testing.T) {