defmodule Plug.CcsAuth do import Plug.Conn @salt "user" # public api def sign(conext, params) do Phoenix.Token.sign(conext, @salt, extract_payload(params)) end def verify(context, token) do case Phoenix.Token.verify(context, @salt, token) do {:ok, %{udid: _udid, user_huid: _user_huid} = payload} -> {:ok, payload} {:ok, _} -> {:error, :missing_params} {:error, reason} -> {:error, reason} end end # Plug callback def init(opts), do: opts def call(conn, _opts) do case verify(conn, parse_bearer_token(conn)) do {:ok, %{udid: udid, user_huid: user_huid}} -> conn |> assign(:udid, udid) |> assign(:user_huid, user_huid) {:error, _reason} -> conn |> halt() |> put_resp_content_type("application/json") |> send_resp(:unauthorized, Poison.encode!(%{error: :unauthorized})) end end # internal functions defp parse_bearer_token(conn) do case get_req_header(conn, "authorization") do ["Bearer " <> token] -> token _ -> nil end end defp extract_payload(params) when is_list(params) do try do %{udid: Keyword.fetch!(params, :udid), user_huid: Keyword.fetch!(params, :user_huid)} rescue KeyError -> raise_params_error end end defp extract_payload(%{udid: _, user_huid: _} = params) when is_map(params) do params end defp extract_payload(_params) do raise_params_error end defp raise_params_error do raise "Plug.CcsAuth.sign/2 accepts map or keywords with :user_huid and :udid" end end