Current section

Files

Jump to
blossom lib blossom plugs put_auth.ex
Raw

lib/blossom/plugs/put_auth.ex

defmodule Blossom.Plugs.PutAuth do
alias Blossom.Plugs.{PutAuth, Utils}
alias Blossom.Tokens
alias Plug.Conn
def init(opts), do: opts
def token_from_header(header) do
fragments = String.split(header)
if String.downcase(List.first(fragments)) == "bearer" do
{:ok, List.last(fragments)}
else
{:error, :no_bearer_token}
end
end
def get_token(conn) do
case Utils.get_auth_header(conn) do
nil -> {:error, :no_authorization_header}
header -> PutAuth.token_from_header(header)
end
end
def get_user(controller, user_id) do
params = %{"id" => user_id, "blocked" => false}
case controller.get(params, :system) do
[] -> {:error, :unknown_user}
[user] -> {:ok, user}
end
end
def put_user(conn, fields, opts) do
case PutAuth.get_user(opts[:users_controller], fields["sub"]) do
{:ok, user} ->
conn
|> Conn.put_private(opts[:jwt_key], fields)
|> Conn.put_private(opts[:user_key], user)
{:error, error} ->
Utils.send_401(conn, error, opts)
end
end
def put_private(outcome, conn, opts) do
case outcome do
{:ok, fields} -> PutAuth.put_user(conn, fields, opts)
{:error, error} -> Utils.send_401(conn, error, opts)
end
end
def get_client(token, opts) do
jwt = Tokens.peek(token)
params = %{"id" => jwt["aud"], "realm" => jwt["iss"], "limit" => 1}
case opts[:clients_controller].get(params, :system) do
[client] -> client
_ -> nil
end
end
def handle_auth(outcome, conn, opts) do
case outcome do
{:ok, token} ->
token
|> Tokens.verify(PutAuth.get_client(token, opts))
|> PutAuth.put_private(conn, opts)
{:error, error} ->
Utils.send_401(conn, error, opts)
end
end
def call(conn, options) do
opts = Utils.get_opts(options)
conn
|> PutAuth.get_token()
|> PutAuth.handle_auth(conn, opts)
end
end