Current section
Files
Jump to
Current section
Files
lib/fireauth.ex
defmodule Fireauth do
@moduledoc """
Fireauth is a small library for Firebase Auth integration:
- `Fireauth.verify_id_token/2` verifies Firebase SecureToken ID tokens.
- `Fireauth.Plug` optionally attaches verified claims to `conn.assigns`
and proxies Firebase hosted auth helper files at `/__/auth/*`.
"""
alias Fireauth.{Claims, TokenValidator}
@type id_token :: String.t()
@type claims :: Claims.t()
@doc """
Verify a Firebase ID token and return its claims.
Delegates to `Fireauth.TokenValidator` (adapter pattern).
"""
@spec verify_id_token(id_token(), keyword()) :: {:ok, claims()} | {:error, term()}
def verify_id_token(token, opts \\ []) when is_binary(token) and is_list(opts) do
TokenValidator.verify_id_token(token, opts)
end
@doc """
Convert verified Firebase claims into the common user attrs map.
"""
@spec claims_to_user_attrs(claims()) :: Fireauth.User.t()
def claims_to_user_attrs(%Claims{} = claims), do: Fireauth.User.from_claims(claims)
@doc """
Check if the given user or claims has an identity for the specified provider.
"""
@spec has_identity?(Fireauth.User.t() | Fireauth.Claims.t(), String.t() | atom()) :: boolean()
def has_identity?(%{identities: identities}, provider) when is_map(identities) do
Map.has_key?(identities, to_string(provider))
end
def has_identity?(_data, _provider), do: false
@doc """
Get the first identity ID for the given provider from a user or claims.
"""
@spec identity(Fireauth.User.t() | Fireauth.Claims.t(), String.t() | atom()) ::
String.t() | nil
def identity(%{identities: identities}, provider) when is_map(identities) do
case Map.get(identities, to_string(provider)) do
[id | _] -> id
_ -> nil
end
end
def identity(_data, _provider), do: nil
end