Intro

A Keycloak client to easily manage authentication, with minimum effort. KeycloakEx is made up of clients and plugs. There are 2 clients:

There are also 2 plugs. Each useful in different scenarios:

NOTE

From keycloak 18 there where a number of update one of which is the removal of "auth" from the host_uri. The plugin was update to remove /auth from the uri by default. So if you are utilizing an older version of Keycloak its important to add "/auth" as part of the host_uri ex: host_uri: "http://localhost:8081/auth"

Setup

User Client

To create a User Client. Add the following snippet in a config.exs file:

config :test_app, TestApp.KeycloakClient,
realm: "test_app",
client_id: "testapp-portal",
site: "http://localhost:4000",
scope: "testapp_scope",
host_uri: "http://localhost:8081",
client_secret: "afdasfasfsf"

Create module with the user client code

defmodule TestApp.KeycloakClient do
use KeycloakEx.Client.User,
otp_app: :test_app
end

Admin Client

To create an Admin Client. Add the following snippet in a config.exs file:

config :test_app, TestApp.KeycloakAdmin,
realm: "master",
username: "admin",
password: "test123!",
client_id: "admin-cli",
host_uri: "http://localhost:8081"

Create module with the admin client code

defmodule TestApp.KeycloakAdmin do
use KeycloakEx.Client.Admin,
otp_app: :test_app
end

Plugs

As mentioned in the introduction the library has 2 different plugs which can be used in different scenarios.

Verify Authorization Bearer Access Token

In the case when the access token is handled by a third party such as the front-end. Utilize the VerifyBearerToken, the plug would check the token and introspect the values of it and redirect if incorrect.

plug KeycloakEx.VerifyBearerToken, client: TestApp.KeycloakClient

Manage token from the backend.

In the case where the access token is managed by the backend in the plug session, utilize the VerifySessionToken.

plug KeycloakEx.VerifySessionToken, client: TestApp.KeycloakClient

Its important to also handle the call back when handling the access token from the backend. For this add the following route in the phoenix router.ex.

get "/login_cb", UserController, :login_redirect

In the controller its important to get the token from the code passed in the call back

defmodule TestApp.UserController do
use TestAppWeb, :controller
def login_redirect(conn, params) do
token =
TestApp.KeycloakClient.get_token!(code: params["code"])
conn
|> put_session(:token, token.token)
|> redirect(to: "/")
|> halt()
end
end