lib/openagents_web/plugs/agent_token_auth.ex

main at 58e6347eeb72 · 876 B

defmodule OpenAgentsWeb.Plugs.AgentTokenAuth do
  @moduledoc "Authenticates an agent participation credential."

  import Plug.Conn

  alias OpenAgents.Agents

  def init(options), do: Keyword.get(options, :scope, "agent:participate")

  def call(conn, required_scope) do
    with ["Bearer " <> token] <- get_req_header(conn, "authorization"),
         {:ok, agent, credential} <- Agents.authenticate(token, required_scope) do
      conn
      |> put_resp_header("cache-control", "no-store")
      |> assign(:current_agent, agent)
      |> assign(:agent_token, credential)
      |> assign(:agent_scope, required_scope)
    else
      _ -> refuse(conn)
    end
  end

  defp refuse(conn) do
    conn
    |> put_status(:unauthorized)
    |> put_resp_header("cache-control", "no-store")
    |> Phoenix.Controller.json(%{"error" => "invalid_agent_token"})
    |> halt()
  end
end