From ef5eb4f710b17b3707233dce6c5cf7f35d821aa8 Mon Sep 17 00:00:00 2001 From: "mark@vectos.net" Date: Tue, 27 Aug 2019 10:31:01 +0200 Subject: [PATCH] Add password support --- .../client/TokenManager.scala | 21 +++++++++++++------ .../core/models/KeycloakConfig.scala | 11 +++++++--- .../scala/com/fullfacing/transport/Main.scala | 2 +- .../src/test/scala/ValidationTests.scala | 2 +- .../src/test/scala/utils/AuthTestData.scala | 2 +- .../test/scala/utils/IntegrationSpec.scala | 2 +- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/keycloak4s-admin/src/main/scala/com/fullfacing/keycloak4s.admin/client/TokenManager.scala b/keycloak4s-admin/src/main/scala/com/fullfacing/keycloak4s.admin/client/TokenManager.scala index 52d9dbeb..c652f96f 100644 --- a/keycloak4s-admin/src/main/scala/com/fullfacing/keycloak4s.admin/client/TokenManager.scala +++ b/keycloak4s-admin/src/main/scala/com/fullfacing/keycloak4s.admin/client/TokenManager.scala @@ -51,17 +51,26 @@ abstract class TokenManager[F[_] : Concurrent, -S](config: KeycloakConfig)(impli private val tokenEndpoint = uri"${config.scheme}://${config.host}:${config.port}/auth/realms/${config.authn.realm}/protocol/openid-connect/token" - private val password = Map( - "grant_type" -> "client_credentials", - "client_id" -> config.authn.clientId, - "client_secret" -> config.authn.clientSecret - ) + private val password = config.authn match { + case KeycloakConfig.Password(_, clientId, username, password) => + Map( + "grant_type" -> "password", + "client_id" -> clientId, + "username" -> username, + "password" -> password + ) + case KeycloakConfig.Secret(_, clientId, clientSecret) => + Map( + "grant_type" -> "client_credentials", + "client_id" -> clientId, + "client_secret" -> clientSecret + ) + } val ref: AtomicReference[Token] = new AtomicReference() private def refresh(token: Token): Map[String, String] = Map( "client_id" -> config.authn.clientId, - "client_secret" -> config.authn.clientSecret, "refresh_token" -> token.refresh, "grant_type" -> "refresh_token" ) diff --git a/keycloak4s-core/src/main/scala/com/fullfacing/keycloak4s/core/models/KeycloakConfig.scala b/keycloak4s-core/src/main/scala/com/fullfacing/keycloak4s/core/models/KeycloakConfig.scala index 4218e94e..aedd2bc1 100644 --- a/keycloak4s-core/src/main/scala/com/fullfacing/keycloak4s/core/models/KeycloakConfig.scala +++ b/keycloak4s-core/src/main/scala/com/fullfacing/keycloak4s/core/models/KeycloakConfig.scala @@ -9,7 +9,12 @@ final case class KeycloakConfig(scheme: String, object KeycloakConfig { - final case class Auth(realm: String, - clientId: String, - clientSecret: String) + sealed trait Auth { + val realm: String + val clientId: String + } + + final case class Password(realm: String, clientId: String, username: String, password: String) extends Auth + + final case class Secret(realm: String, clientId: String, clientSecret: String) extends Auth } diff --git a/keycloak4s-playground/src/main/scala/com/fullfacing/transport/Main.scala b/keycloak4s-playground/src/main/scala/com/fullfacing/transport/Main.scala index 38bbad11..c3b08eaa 100644 --- a/keycloak4s-playground/src/main/scala/com/fullfacing/transport/Main.scala +++ b/keycloak4s-playground/src/main/scala/com/fullfacing/transport/Main.scala @@ -30,7 +30,7 @@ object Main extends TaskApp { val adminClient: String = "admin-cli" //Name of the admin Client inside adminRealm. val adminSecret: String = "???" //Secret of adminClient. - val authConfig = KeycloakConfig.Auth(adminRealm, adminClient, adminSecret) + val authConfig = KeycloakConfig.Secret(adminRealm, adminClient, adminSecret) val config = KeycloakConfig("http", host, port, targetRealm, authConfig) def run(args: List[String]): Task[ExitCode] = Akka.connect().flatMap { _ => diff --git a/keycloak4s-playground/src/test/scala/ValidationTests.scala b/keycloak4s-playground/src/test/scala/ValidationTests.scala index d0df1e72..f73a3c7a 100644 --- a/keycloak4s-playground/src/test/scala/ValidationTests.scala +++ b/keycloak4s-playground/src/test/scala/ValidationTests.scala @@ -21,7 +21,7 @@ class ValidationTests extends FlatSpec with Matchers with PrivateMethodTester wi val port = 8080 val realm = "test" - val authConfig = KeycloakConfig.Auth("", "", "") + val authConfig = KeycloakConfig.Secret("", "", "") val config = KeycloakConfig(scheme, host, port, realm, authConfig) val validator: TokenValidator = TokenValidator.Static(TestData.jwkSet, config) diff --git a/keycloak4s-playground/src/test/scala/utils/AuthTestData.scala b/keycloak4s-playground/src/test/scala/utils/AuthTestData.scala index f4824ed4..19992f93 100644 --- a/keycloak4s-playground/src/test/scala/utils/AuthTestData.scala +++ b/keycloak4s-playground/src/test/scala/utils/AuthTestData.scala @@ -12,7 +12,7 @@ object AuthTestData { val port = 8080 val realm = "test" - val authConfig = KeycloakConfig.Auth("", "", "") + val authConfig = KeycloakConfig.Secret("", "", "") val keycloakConfig = KeycloakConfig(scheme, host, port, realm, authConfig) implicit val validator: TokenValidator = TokenValidator.Static(TestData.jwkSet, keycloakConfig) diff --git a/keycloak4s-playground/src/test/scala/utils/IntegrationSpec.scala b/keycloak4s-playground/src/test/scala/utils/IntegrationSpec.scala index c9ff57b4..99a96332 100644 --- a/keycloak4s-playground/src/test/scala/utils/IntegrationSpec.scala +++ b/keycloak4s-playground/src/test/scala/utils/IntegrationSpec.scala @@ -18,7 +18,7 @@ class IntegrationSpec extends AsyncFlatSpec with Matchers with Inspectors { type T = ByteString /* Keycloak Server Configuration **/ - val authConfig = KeycloakConfig.Auth("master", "admin-cli", ServerInitializer.clientSecret) + val authConfig = KeycloakConfig.Secret("master", "admin-cli", ServerInitializer.clientSecret) val keycloakConfig = KeycloakConfig("http", "127.0.0.1", 8080, "master", authConfig) /* Keycloak Client Implicits **/