Current section

Files

Jump to
noa lib noa_web plugs resource_authenticator.ex
Raw

lib/noa_web/plugs/resource_authenticator.ex

defmodule NoaWeb.Plugs.ResourceAuthenticator do
@moduledoc false
import Plug.Conn
require Logger
alias Comeonin.Bcrypt
alias Noa.Actors.{Resource, Resources}
def init(opts), do: opts
def call(conn, _opts) do
resource_id = Map.get(conn.params, "resource_id")
resource_secret = Map.get(conn.params, "resource_secret")
res = authenticated_resource(resource_id, resource_secret)
if res, do: conn |> add_to_ctxt(res), else: conn
rescue
e ->
conn
|> put_resp_header("content-type", "application/json")
|> send_resp(500, ~s({"error": "server_error #{inspect e}"}))
|> halt()
end
defp authenticated_resource(nil, nil), do: nil
defp authenticated_resource(id, secret) do
case Resources.lookup(id || "") do
%Resource{} = res ->
if Bcrypt.checkpw(secret || "", res.secret_hash),
do: res,
else: nil
_ -> Bcrypt.dummy_checkpw(); nil
end
end
defp add_to_ctxt(conn, res) do
ctxt = Map.get(conn.assigns, :noa_ctxt, %{})
conn |> assign(:noa_ctxt, Map.put(ctxt, :resource, res))
end
end