github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/crypto/jwt_test.go (about)

     1  package crypto
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	jwt "github.com/golang-jwt/jwt/v5"
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  type Claims struct {
    12  	jwt.RegisteredClaims
    13  	Foo string `json:"foo"`
    14  }
    15  
    16  func TestNewJWT(t *testing.T) {
    17  	secret := GenerateRandomBytes(64)
    18  	tokenString, err := NewJWT(secret, jwt.RegisteredClaims{
    19  		Audience: jwt.ClaimStrings{"test"},
    20  		Issuer:   "example.org",
    21  		IssuedAt: jwt.NewNumericDate(time.Now()),
    22  		Subject:  "cozy.io",
    23  	})
    24  	assert.NoError(t, err)
    25  
    26  	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    27  		_, ok := token.Method.(*jwt.SigningMethodHMAC)
    28  		assert.True(t, ok, "The signing method should be HMAC")
    29  		return secret, nil
    30  	})
    31  	assert.NoError(t, err)
    32  	assert.True(t, token.Valid)
    33  
    34  	claims, ok := token.Claims.(jwt.MapClaims)
    35  	assert.True(t, ok, "Claims can be parsed as standard claims")
    36  	assert.Equal(t, []interface{}{"test"}, claims["aud"])
    37  	assert.Equal(t, "example.org", claims["iss"])
    38  	assert.Equal(t, "cozy.io", claims["sub"])
    39  }
    40  
    41  func TestParseJWT(t *testing.T) {
    42  	secret := GenerateRandomBytes(64)
    43  	tokenString, err := NewJWT(secret, Claims{
    44  		jwt.RegisteredClaims{
    45  			Audience: jwt.ClaimStrings{"test"},
    46  			Issuer:   "example.org",
    47  			IssuedAt: jwt.NewNumericDate(time.Now()),
    48  			Subject:  "cozy.io",
    49  		},
    50  		"bar",
    51  	})
    52  	assert.NoError(t, err)
    53  
    54  	claims := Claims{}
    55  	err = ParseJWT(tokenString, func(token *jwt.Token) (interface{}, error) {
    56  		return secret, nil
    57  	}, &claims)
    58  	assert.NoError(t, err)
    59  	assert.Equal(t, jwt.ClaimStrings{"test"}, claims.Audience)
    60  	assert.Equal(t, "example.org", claims.Issuer)
    61  	assert.Equal(t, "cozy.io", claims.Subject)
    62  	assert.Equal(t, "bar", claims.Foo)
    63  }
    64  
    65  func TestParseInvalidJWT(t *testing.T) {
    66  	secret := GenerateRandomBytes(64)
    67  	tokenString, err := NewJWT(secret, Claims{
    68  		jwt.RegisteredClaims{
    69  			Audience: jwt.ClaimStrings{"test"},
    70  			Issuer:   "example.org",
    71  			IssuedAt: jwt.NewNumericDate(time.Now()),
    72  			Subject:  "cozy.io",
    73  		},
    74  		"bar",
    75  	})
    76  	assert.NoError(t, err)
    77  
    78  	err = ParseJWT("invalid-token", func(token *jwt.Token) (interface{}, error) {
    79  		return secret, nil
    80  	}, &Claims{})
    81  	assert.Error(t, err)
    82  
    83  	invalidSecret := GenerateRandomBytes(64)
    84  	err = ParseJWT(tokenString, func(token *jwt.Token) (interface{}, error) {
    85  		return invalidSecret, nil
    86  	}, &Claims{})
    87  	assert.Error(t, err)
    88  }