authorizer/server/test/jwt_test.go

204 lines
8.1 KiB
Go
Raw Normal View History

2022-02-12 13:56:37 +00:00
package test
import (
"testing"
"time"
"github.com/authorizerdev/authorizer/server/constants"
2022-02-28 02:25:01 +00:00
"github.com/authorizerdev/authorizer/server/crypto"
2022-05-30 03:49:55 +00:00
"github.com/authorizerdev/authorizer/server/memorystore"
2022-02-12 13:56:37 +00:00
"github.com/authorizerdev/authorizer/server/token"
"github.com/golang-jwt/jwt"
2022-03-02 12:12:31 +00:00
"github.com/google/uuid"
2022-02-12 13:56:37 +00:00
"github.com/stretchr/testify/assert"
)
func TestJwt(t *testing.T) {
2022-02-28 02:25:01 +00:00
// persist older data till test is done and then reset it
2022-05-30 07:17:50 +00:00
jwtType, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyJwtType)
assert.Nil(t, err)
publicKey, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyJwtPublicKey)
assert.Nil(t, err)
privateKey, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyJwtPrivateKey)
assert.Nil(t, err)
clientID, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyClientID)
assert.Nil(t, err)
2022-03-02 12:12:31 +00:00
nonce := uuid.New().String()
hostname := "localhost"
subject := "test"
2022-02-12 13:56:37 +00:00
claims := jwt.MapClaims{
"exp": time.Now().Add(time.Minute * 30).Unix(),
"iat": time.Now().Unix(),
"email": "test@yopmail.com",
2022-03-02 12:12:31 +00:00
"sub": subject,
2022-02-28 02:25:01 +00:00
"aud": clientID,
2022-03-02 12:12:31 +00:00
"nonce": nonce,
"iss": hostname,
2022-02-12 13:56:37 +00:00
}
t.Run("invalid jwt type", func(t *testing.T) {
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "invalid")
2022-02-12 13:56:37 +00:00
token, err := token.SignJWTToken(claims)
assert.Error(t, err, "unsupported signing method")
assert.Empty(t, token)
})
t.Run("expired jwt token", func(t *testing.T) {
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "HS256")
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtSecret, "test")
2022-02-12 13:56:37 +00:00
expiredClaims := jwt.MapClaims{
"exp": time.Now().Add(-time.Minute * 30).Unix(),
"iat": time.Now().Unix(),
"email": "test@yopmail.com",
}
jwtToken, err := token.SignJWTToken(expiredClaims)
assert.NoError(t, err)
2022-06-11 13:40:39 +00:00
_, err = token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.Error(t, err, err.Error(), "Token is expired")
})
t.Run("HMAC algorithms", func(t *testing.T) {
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtSecret, "test")
2022-02-12 13:56:37 +00:00
t.Run("HS256", func(t *testing.T) {
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "HS256")
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
t.Run("HS384", func(t *testing.T) {
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "HS384")
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
t.Run("HS512", func(t *testing.T) {
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "HS512")
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
})
t.Run("RSA algorithms", func(t *testing.T) {
t.Run("RS256", func(t *testing.T) {
2022-02-28 02:25:01 +00:00
_, privateKey, publickKey, _, err := crypto.NewRSAKey("RS256", clientID)
assert.NoError(t, err)
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "RS256")
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPrivateKey, privateKey)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPublicKey, publickKey)
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
t.Run("RS384", func(t *testing.T) {
2022-02-28 02:25:01 +00:00
_, privateKey, publickKey, _, err := crypto.NewRSAKey("RS384", clientID)
assert.NoError(t, err)
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "RS384")
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPrivateKey, privateKey)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPublicKey, publickKey)
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
t.Run("RS512", func(t *testing.T) {
2022-02-28 02:25:01 +00:00
_, privateKey, publickKey, _, err := crypto.NewRSAKey("RS512", clientID)
assert.NoError(t, err)
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "RS512")
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPrivateKey, privateKey)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPublicKey, publickKey)
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
})
t.Run("ECDSA algorithms", func(t *testing.T) {
t.Run("ES256", func(t *testing.T) {
2022-02-28 02:25:01 +00:00
_, privateKey, publickKey, _, err := crypto.NewECDSAKey("ES256", clientID)
assert.NoError(t, err)
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "ES256")
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPrivateKey, privateKey)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPublicKey, publickKey)
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
t.Run("ES384", func(t *testing.T) {
2022-02-28 02:25:01 +00:00
_, privateKey, publickKey, _, err := crypto.NewECDSAKey("ES384", clientID)
assert.NoError(t, err)
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "ES384")
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPrivateKey, privateKey)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPublicKey, publickKey)
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
t.Run("ES512", func(t *testing.T) {
2022-02-28 02:25:01 +00:00
_, privateKey, publickKey, _, err := crypto.NewECDSAKey("ES512", clientID)
assert.NoError(t, err)
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, "ES512")
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPrivateKey, privateKey)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPublicKey, publickKey)
2022-02-12 13:56:37 +00:00
jwtToken, err := token.SignJWTToken(claims)
assert.NoError(t, err)
assert.NotEmpty(t, jwtToken)
2022-06-11 13:40:39 +00:00
c, err := token.ParseJWTToken(jwtToken)
2022-02-12 13:56:37 +00:00
assert.NoError(t, err)
assert.Equal(t, c["email"].(string), claims["email"])
2022-06-11 13:40:39 +00:00
valid, err := token.ValidateJWTClaims(c, hostname, nonce, subject)
assert.NoError(t, err)
assert.True(t, valid)
2022-02-12 13:56:37 +00:00
})
})
2022-05-30 07:17:50 +00:00
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtType, jwtType)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPublicKey, publicKey)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyJwtPrivateKey, privateKey)
2022-02-12 13:56:37 +00:00
}