defmodule Rivet.Auth.Token.Access do alias Rivet.Auth alias Rivet.Ident @doc ~S""" Generate an auth JWT to our specification ``` iex> alias Rivet.Ident.Factor iex> {:ok, token, claims} = jwt(%Factor{id: "AB", details: %{type: "acc"}}, "example.com", 5*60) iex> claims.aud "caa1:acc:example.com" iex> claims.sub "cas1:AB" iex> String.slice(token, 0..1) "ey" iex> {:ok, token, claims} = jwt("narf", "example.com", 5*60) iex> claims.aud "caa1:acc:example.com" iex> claims.sub "cas1:narf" iex> String.slice(token, 0..1) "ey" iex> {:ok, "ey" <> _rest, %{sub: "cas1:userid"}} = jwt("userid", "hostname") ``` """ @spec jwt( target :: Ident.Factor.t(), hostname :: String.t(), testing_only_expiration_offset :: nil | integer() ) :: {:ok, token :: String.t(), claims :: map()} def jwt(factor, hostname, exp \\ 0) def jwt(%Ident.Factor{details: %{type: "acc"}} = factor, hostname, exp) do exp = if is_number(exp) and exp > 0, do: exp, else: Rivet.Auth.Settings.expire_limit(:acc) Auth.Token.Create.jwt(:acc, "cas1:#{factor.id}", hostname, exp) end def jwt(user_id, hostname, exp) when is_binary(user_id) and is_integer(exp) and is_binary(hostname), do: Auth.Token.Create.jwt(:acc, "cas1:#{user_id}", hostname, exp) end