lib/firebase_admin/client.ex

defmodule FirebaseAdmin.Client do
  use Tesla
  alias FirebaseAdmin.Token

  def get_users(uid) do
    get_users_with(:localId, uid)
  end

  def get_user_with_phone(phone) do
    get_users_with(:phoneNumber, phone)
  end

  def get_user_with_email(email) do
    get_users_with(:email, email)
  end

  def get_users_with(key, value) do
    post(client(), "v1/accounts:lookup", %{key => value})
  end

  def custom_token(uid, service_account) do
    payload = %{
      "iss" => service_account.client_email,
      "sub" => service_account.client_email,
      "aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
      "uid" => uid
    }
    signer = Joken.Signer.create("RS256", %{"pem" => service_account.private_key})
    Token.generate_and_sign!(payload, signer)
  end

  def sign_in_with_custom_token(token) do
     post(client(), "v1/accounts:signInWithCustomToken", %{token: token, returnSecureToken: true})
  end

  def client() do
    {:ok, token} = Goth.fetch(FirebaseAdmin.Goth)

    middleware = [
      {Tesla.Middleware.BaseUrl, "https://identitytoolkit.googleapis.com/"},
      Tesla.Middleware.JSON,
      {Tesla.Middleware.Headers, [{"authorization", "Bearer " <> token.token}]}
    ]

    adapter = {Tesla.Adapter.Hackney, [recv_timeout: 10_000]}

    Tesla.client(middleware, adapter)
  end
end