The Firebase Admin Elixir SDK enables access to Firebase services from privileged environments (such as servers or cloud) in Elixir.
For more information, visit the Firebase Admin SDK setup guide.
- Add
firebase_admin_ex
to your list of dependencies inmix.exs
:
defmodule YourApplication.Mixfile do
use Mix.Project
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:firebase_admin_ex, "~> 0.1.0"}
]
end
end
Next, run mix deps.get
to pull down the dependencies:
$ mix deps.get
Now you can make an API call by obtaining an access token and using the generated modules.
Authentication is typically done through Application Default Credentials which means you do not have to change the code to authenticate as long as your environment has credentials.
Start by creating a Service Account key file.
This file can be used to authenticate to Google Cloud Platform services from any environment.
To use the file, set the GOOGLE_APPLICATION_CREDENTIALS
environment variable to
the path to the key file. Alternatively you may configure goth (the
the authentication ssyas described at
https://github.com/peburrows/goth#installation
For example:
$ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account.json
If you are deploying to App Engine, Compute Engine, or Container Engine, your credentials will be available by default.
- Sending a
WebMessage
# Get your device registration token
registration_token = "user-device-token"
# Define message payload attributes
message = FirebaseAdminEx.Messaging.Message.new(%{
data: %{},
token: registration_token,
webpush: FirebaseAdminEx.Messaging.WebMessage.Config.new(%{
headers: %{},
data: %{},
title: "notification title",
body: "notification body",
icon: "https://icon.png"
})
})
# Call the Firebase messaging V1 send API
project_id = "YOUR-FIREBASE-PROJECT-ID"
{:ok, response} = FirebaseAdminEx.Messaging.send(project_id, message)
- Sending a
AndroidMessage
# Get your device registration token
registration_token = "user-device-token"
# Define message payload attributes
message = FirebaseAdminEx.Messaging.Message.new(%{
data: %{},
token: registration_token,
android: FirebaseAdminEx.Messaging.AndroidMessage.Config.new(%{
headers: %{},
data: %{},
title: "notification title",
body: "notification body",
icon: "https://icon.png"
})
})
# Call the Firebase messaging V1 send API
project_id = "YOUR-FIREBASE-PROJECT-ID"
{:ok, response} = FirebaseAdminEx.Messaging.send(project_id, message)
- Sending a
APNSMessage
# Get your device registration token
registration_token = "user-device-token"
# Define message payload attributes
message = FirebaseAdminEx.Messaging.Message.new(%{
data: %{},
token: registration_token,
apns: FirebaseAdminEx.Messaging.APNSMessage.Config.new(%{
headers: %{},
payload: %{
aps: %{
alert: %{
title: "Message Title",
body: "Message Body"
},
sound: "default",
"content-available": 1
},
custom_data: %{}
}
})
})
# Call the Firebase messaging V1 send API
project_id = "YOUR-FIREBASE-PROJECT-ID"
{:ok, response} = FirebaseAdminEx.Messaging.send(project_id, message)
The FirebaseAdminEx.Auth
module allows for some limited management of the
Firebase Autentication system. It currently supports getting, deleting and creating users.
- Getting a user by
uid
:
iex(1)> FirebaseAdminEx.Auth.get_user("hYQIfs35Rfa4UMeDaf8lhcmUeTE2")
{:ok,
"{\n \"kind\": \"identitytoolkit#GetAccountInfoResponse\",\n \"users\": [\n {\n \"localId\": \"hYQIfs35Rfa4UMeDaf8lhcmUeTE2\",\n \"providerUserInfo\": [\n {\n \"providerId\": \"phone\",\n \"rawId\": \"+61400000111\",\n \"phoneNumber\": \"+61400000111\"\n }\n ],\n \"lastLoginAt\": \"1543976568000\",\n \"createdAt\": \"1543976568000\",\n \"phoneNumber\": \"+61400000111\"\n }\n ]\n}\n"}
- Getting a user by phone number
iex(1)> FirebaseAdminEx.Auth.get_user_by_phone_number("+61400000111")
{:ok,
"{\n \"kind\": \"identitytoolkit#GetAccountInfoResponse\",\n \"users\": [\n {\n \"localId\": \"hYQIfs35Rfa4UMeDaf8lhcmUeTE2\",\n \"providerUserInfo\": [\n {\n \"providerId\": \"phone\",\n \"rawId\": \"+61400000111\",\n \"phoneNumber\": \"+61400000111\"\n }\n ],\n \"lastLoginAt\": \"1543976568000\",\n \"createdAt\": \"1543976568000\",\n \"phoneNumber\": \"+61400000111\"\n }\n ]\n}\n"}
- Getting a user by email address
iex(1)> FirebaseAdminEx.Auth.get_user_by_email("user@example.com")
{:ok,
"{\n \"kind\": \"identitytoolkit#GetAccountInfoResponse\",\n \"users\": [\n {\n \"localId\": \"hYQIfs35Rfa4UMeDaf8lhcmUeTE2\",\n \"providerUserInfo\": [\n {\n \"providerId\": \"phone\",\n \"rawId\": \"+61400000111\",\n \"phoneNumber\": \"+61400000111\"\n \"email\": \"user@example.com\"\n }\n ],\n \"lastLoginAt\": \"1543976568000\",\n \"createdAt\": \"1543976568000\",\n \"phoneNumber\": \"+61400000111\"\n }\n ]\n}\n"}
- Deleting a user
iex(4)> FirebaseAdminEx.Auth.delete_user("hYQIfs35Rfa4UMeDaf8lhcmUeTE2")
{:ok, "{\n \"kind\": \"identitytoolkit#DeleteAccountResponse\"\n}\n"}
- Creating a user
iex(4)> FirebaseAdminEx.Auth.create_email_password_user(%{"email" => "user@email.com", "password" => "hYQIfs35Rfa4UMeDaf8lhcmUeTE2"})
{:ok,
"{\n \"kind\": \"identitytoolkit#SignupNewUserResponse\",\n \"email\": \"user@email.com\",\n \"localId\": \"s5dggHJyr3fgdgJkLe234G6h6y\"\n}\n"}
- Generating the email action link for sign-in flows
# Define ActionCodeSettings
action_code_settings =
FirebaseAdminEx.Auth.ActionCodeSettings.new(
%{
requestType: "EMAIL_SIGNIN",
email: "user@email.com",
returnOobLink: true,
continueUrl: "www.test.com/sign-in",
canHandleCodeInApp: false,
dynamicLinkDomain: "",
androidPackageName: "",
androidMinimumVersion: "",
androidInstallApp: false,
iOSBundleId: ""
}
)
client_email = "YOUR-FIREBASE-CLIENT-EMAIL"
project_id = "YOUR-FIREBASE-PROJECT-ID"
iex(4)> FirebaseAdminEx.Auth.generate_sign_in_with_email_link(action_code_settings, client_email, project_id)
{:ok,
"{\n \"kind\": \"identitytoolkit#GetOobConfirmationCodeResponse\",\n \"email\": \"user@email.com\",\n \"oobLink\": \"https://YOUR-FIREBASE-CLIENT.firebaseapp.com/__/auth/action?mode=signIn&oobCode=xcdwelFRvfbtghHjswvw2f3g46hh6j8&apiKey=Fgae35h6j78_vbsddgs34th6h6hhekj97gfj&lang=en&continueUrl=www.test.com/sign-in\"\n}\n"}
- Verify user's ID token
# Fetch the id_token generated by firebase client for the user and pass to to verify_token(id_token, allow_unverified \\ true). It checks for valid certificate, issuer, audience, expiry and optionally if the user has a verified email address.
#Returns user object with token details on successful verification.
#Valid id token
iex(5)> id_token = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImQ1OThkYjVjZjE1ZWNhOTI0OWJhZTUzMDYzOWVkYzUzNmMzYzViYjUiLCJ0eXAiOiJKV1QifQ"
iex(6)> FirebaseAdminEx.Auth.verify_token(id_token)
{:ok,
%{
"aud" => "YOUR-FIREBASE-PROJECT",
"auth_time" => 1577079586,
"email" => "useremail@domain.com",
"email_verified" => false,
"exp" => 1577087136,
"firebase" => %{
"identities" => %{"email" => ["useremail@domain.com"]},
"sign_in_provider" => "password"
},
"iat" => 1577083536,
"iss" => "https://securetoken.google.com/YOUR-FIREBASE-PROJECT",
"sub" => "xxxxxxxxxxxxxxxxxxxx",
"user_id" => "USER-UID-ON-FIREBASE"
}}
#Expired id_token
iex(7)> id_token = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImQ1OThkYjVjZjE1ZWNhOTI0OWJhZTUzMDYzOWVkYzUzNmMzYzViYjUiLCJ0eXAiOiJKtyerdf"
iex(8)> FirebaseAdminEx.Auth.verify_token(id_token)
{:error, "Token has passed it's expiry time"}
#Force check for verified email address
iex(9)> id_token = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImQ1OThkYjVjZjE1ZWNhOTI0OWJhZTUzMDYzOWVkYzUzNmMzYzViYjUiLCJ0eXAiOiJKV1QifQ"
iex(10)> FirebaseAdminEx.Auth.verify_token(id_token,false)
{:error, "Email is not verified"}
Your use of Firebase is governed by the Terms of Service for Firebase Services.
This is not an officially supported Google product.