From 651c0bad2fec283d4f74b1a81e8f1fc36e77d5d2 Mon Sep 17 00:00:00 2001 From: Ross Date: Wed, 3 Apr 2024 00:07:37 -0400 Subject: [PATCH] Improved token parsing - Used code style for return and formatting - Replaced string.split with string.field to avoid panic --- auth/builtin.go | 26 +++++++++++--------------- auth/builtin_test.go | 14 +++++++++++--- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/auth/builtin.go b/auth/builtin.go index ecc8fa6e..b8e2d9df 100644 --- a/auth/builtin.go +++ b/auth/builtin.go @@ -1,7 +1,6 @@ package auth import ( - "errors" "strings" "github.com/golang-jwt/jwt/v4" @@ -62,30 +61,27 @@ func (r *NoAuth) Refresh(refresh string) (token Token, err error) { type Builtin struct{} // Parse Token out of a string -func ParseToken(requestToken string) (string, error) { - splitToken := strings.Split(requestToken, " ") - if splitToken[0] != "Bearer" { - return "", errors.New("authentication header not of type bearer") - } - token := strings.TrimSpace(splitToken[1]) - if len(token) < 1 { - return "", errors.New("no authentication header found") +func parseToken(requestToken string) (token string, err error) { + splitToken := strings.Fields(requestToken) + if len(splitToken) != 2 || strings.ToLower(splitToken[0]) != "bearer" { + err = liberr.Wrap(&NotValid{Token: requestToken}) + return } - - return token, nil + token = splitToken[1] + return } // Authenticate the token func (r *Builtin) Authenticate(request *Request) (jwToken *jwt.Token, err error) { - token, err := ParseToken(request.Token) - if err != nil { - return nil, err - } defer func() { if err != nil { Log.Info(err.Error()) } }() + token, err := parseToken(request.Token) + if err != nil { + return + } jwToken, err = jwt.Parse( token, func(jwToken *jwt.Token) (secret interface{}, err error) { diff --git a/auth/builtin_test.go b/auth/builtin_test.go index 75695ee7..42ea1e5c 100644 --- a/auth/builtin_test.go +++ b/auth/builtin_test.go @@ -26,6 +26,14 @@ func TestParseToken(t *testing.T) { want: "", wantErr: true, }, + { + name: "Empty Bearer token no whitespace", + args: args{ + requestToken: "Bearer", + }, + want: "", + wantErr: true, + }, { name: "Empty request Token", args: args{ @@ -45,13 +53,13 @@ func TestParseToken(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := ParseToken(tt.args.requestToken) + got, err := parseToken(tt.args.requestToken) if (err != nil) != tt.wantErr { - t.Errorf("ParseToken() error = %v, wantErr %v", err, tt.wantErr) + t.Errorf("parseToken() error = %v, wantErr %v", err, tt.wantErr) return } if got != tt.want { - t.Errorf("ParseToken() = %v, want %v", got, tt.want) + t.Errorf("parseToken() = %v, want %v", got, tt.want) } }) }