Current section
Files
Jump to
Current section
Files
lib/clients/admin.ex
defmodule KeycloakEx.Client.Admin do
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
@otp_app opts[:otp_app]
use OAuth2.Strategy
def config() do
Application.get_env(@otp_app, __MODULE__, [])
end
def new do
conf = config()
OAuth2.Client.new([
strategy: OAuth2.Strategy.Password,
client_id: conf[:client_id],
token_url: "#{conf[:host_uri]}/auth/realms/#{conf[:realm]}/protocol/openid-connect/token"
])
|> OAuth2.Client.put_serializer("application/json", Jason)
end
def get_token(headers \\ []) do
conf = config()
OAuth2.Client.get_token!(new(), [username: conf[:username], password: conf[:password]], headers)
end
def child_spec() do
conf = config()
{
Finch,
name: __MODULE__,
pools: %{
:default => [size: 10],
"#{conf[:host_uri]}" => [size: 32, count: 8]
}
}
end
# Not needed for Login client
def authorize_url(_client, _params \\ []) do
nil
end
def get_token(_client, _params, _headers) do
nil
end
defp response({:ok, resp}), do: Jason.decode!(resp.body)
defp response(resp), do: resp
def get_request_realm(realm, url, body \\ nil) do
conf = config()
:get
|> Finch.build(
"#{conf[:host_uri]}/auth/admin/realms/#{realm}/#{url}",
[
{"Authorization", "Bearer #{get_token().token.access_token}"},
{"Accept", "application/json"}
],
body
)
|> Finch.request(__MODULE__)
|> response
end
def get_clients(realm) do
get_request_realm(realm, "clients")
end
def get_users(realm) do
get_request_realm(realm, "users")
end
def get_user_by_username(realm, username) do
get_request_realm(realm, "users?username=#{username}")
end
def get_user(realm, id) do
get_request_realm(realm, "users/#{id}")
end
def get_user_count(realm) do
get_request_realm(realm, "users/count")
end
def get_users_profile(realm) do
get_request_realm(realm, "users/profile")
end
end
end
end