Packages
charon
0.0.4-alpha
4.3.0
4.3.0-beta1
4.2.0
4.2.0-beta3
4.2.0-beta2
4.2.0-beta1
4.1.0
4.0.1
4.0.0
4.0.0-beta3
4.0.0-beta2
4.0.0-beta1
3.4.1
3.4.0
3.3.0
3.2.0
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-beta1
2.8.0
2.8.0-beta1
2.7.3
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.0
2.3.0
2.2.0
2.2.0-beta
2.1.3
2.1.2
2.1.2-beta
2.1.1
2.1.0
2.0.0
1.3.4
1.3.3
1.3.2-beta
1.3.1-beta
1.3.0-beta
1.2.0-beta
1.1.0-beta
1.0.1-beta
1.0.0-beta1
0.0.4-alpha
0.0.3-alpha
0.0.2-alpha
0.0.1-alpha
Authentication & sessions for API's.
Current section
Files
Jump to
Current section
Files
lib/charon/internal.ex
defmodule Charon.Internal do
@moduledoc false
# module consists of shared functions internal to the package
use Charon.Constants
require Logger
alias Plug.Conn
def auth_error(conn, error) do
Conn.put_private(conn, @auth_error, error)
end
def now(), do: System.system_time(:second)
def get_private(_conn = %{private: priv}, key), do: Map.get(priv, key)
def put_private(conn = %{private: priv}, map) do
%{conn | private: Map.merge(priv, map)}
end
# generate random IDs of a specified bit length, default 128
# 2^128 == 16^32 so 128 bits of randomness is equal to a UUID (actually slightly more)
def random_url_encoded(byte_size) do
byte_size |> :crypto.strong_rand_bytes() |> Base.url_encode64(padding: false)
end
def process_optional_config(config, optional_key, defaults, required) do
optional = Map.fetch!(config.optional_modules, optional_key)
Enum.each(required, &Map.fetch!(optional, &1))
Map.merge(defaults, optional)
end
def parse_sig_transport(token_signature_transport)
def parse_sig_transport("bearer"), do: :bearer
def parse_sig_transport("cookie"), do: :cookie
def parse_sig_transport(:bearer), do: :bearer
def parse_sig_transport(:cookie), do: :cookie
def split_signature(token, ttl, cookie_opts) do
[header, payload, signature] = String.split(token, ".", parts: 3)
token = [header, ?., payload, ?.] |> IO.iodata_to_binary()
cookie_opts = Keyword.put(cookie_opts, :max_age, ttl)
{token, signature, cookie_opts}
end
end