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
|
|
|
}
|