Current section
Files
Jump to
Current section
Files
lib/noa_web/controllers/token_utils.ex
defmodule NoaWeb.TokenUtils do
@moduledoc false
alias Noa.Tokens
alias Noa.Tokens.{AC, AT, RT, StubHandler}
@doc false
@spec get_validated_token(binary, binary) :: {:ok, Tokens.token_t} | {:error, atom}
def get_validated_token(stub, "authorization_code" = tt), do: get_token_by_stub(AC, tt, stub)
def get_validated_token(stub, "access_token" = tt), do: get_token_by_stub(AT, tt, stub)
def get_validated_token(stub, "refresh_token" = tt), do: get_token_by_stub(RT, tt, stub)
def get_validated_token(_, _), do: {:error, :unsupported_token_type}
@doc false
def check_validity_period(token), do: cvp_result(Tokens.validity_period_status(token))
@doc false
def check_revocation_status(token), do: crs_result(Tokens.revoked?(token))
defp get_token_by_stub(token_module, token_type, stub) do
with {:ok, id, _} <- StubHandler.decode_stub(token_type, stub),
token when token != nil <- Tokens.lookup(token_module, id)
do
{:ok, token}
else
_ -> {:error, :invalid_grant}
end
end
defp cvp_result(:in), do: :ok
defp cvp_result(:before), do: {:error, :used_before_validity}
defp cvp_result(:after), do: {:error, :used_after_validity}
defp crs_result(false), do: :ok
defp crs_result(true), do: {:error, :revoked}
end