lib/auth0_plug/jwt.ex

defmodule Auth0Plug.Jwt do
  alias Auth0Plug.Jwt
  alias JOSE.{JWK, JWT}
  alias Plug.Conn

  @doc """
  Extracts the jwt from the header, when present.
  """
  def get(conn) do
    conn
    |> Conn.get_req_header("authorization")
    |> List.to_string()
    |> String.split(" ")
    |> List.last()
  end

  def verify(_token, nil), do: {:error, nil}

  def verify(token, secret) do
    result =
      secret
      |> JWK.from_oct()
      |> JWT.verify(token)

    case result do
      {true, jwt, _jws} -> {:ok, jwt}
      {false, jwt, _jws} -> {:error, jwt}
      {:error, e} -> {:error, e}
    end
  end

  def put_extraction(conn, jwt, {key, conn_key}) do
    if key == nil do
      Conn.put_private(conn, conn_key, jwt)
    else
      Conn.put_private(conn, conn_key, Map.get(jwt, key))
    end
  end

  def put(conn, %{fields: jwt}) do
    :auth0_plug
    |> Application.get_env(:extractions)
    |> Enum.reduce(conn, fn extraction, acc ->
      Jwt.put_extraction(acc, jwt, extraction)
    end)
  end
end