Current section

Files

Jump to
plug_ccsauth lib plug ccs_auth.ex
Raw

lib/plug/ccs_auth.ex

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