39 lines
878 B
Elixir
39 lines
878 B
Elixir
defmodule ZoeyscomputerWeb.Plugs.ApiAuthentication do
|
|
alias Zoeyscomputer.ApiKeys
|
|
import Plug.Conn
|
|
|
|
def init(opts), do: opts
|
|
|
|
def call(conn, _opts) do
|
|
case get_auth_token(conn) do
|
|
nil ->
|
|
handle_unauthorized(conn)
|
|
|
|
token ->
|
|
case ApiKeys.authenticate_api_key(token) do
|
|
nil ->
|
|
handle_unauthorized(conn)
|
|
|
|
user ->
|
|
conn
|
|
|> assign(:current_user, user)
|
|
|> assign(:authenticated_with_api_key, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
defp get_auth_token(conn) do
|
|
case get_req_header(conn, "authorization") do
|
|
["Bearer " <> token] -> token
|
|
_ -> nil
|
|
end
|
|
end
|
|
|
|
defp handle_unauthorized(conn) do
|
|
conn
|
|
|> put_status(:unauthorized)
|
|
|> Phoenix.Controller.put_view(ZoeyscomputerWeb.ErrorJSON)
|
|
|> Phoenix.Controller.render(:"401")
|
|
|> halt()
|
|
end
|
|
end
|