Skip to content
Branch: master
Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Android Components > Samples > Firefox Accounts (FxA)

A simple app showcasing the service-firefox-account component.


The main concepts shown in the sample app are:

  • Usage of the asynchronous result type Deferred
  • Setting up aFirefoxAccount object, from a previous session or from scratch
  • Spawning a custom tab or a WebView to handle the user's authentication flow

A minimal walkthrough is also provided in the component README.

Setting up the account

From a previous session

FirefoxAccount is a representation of the authentication state for the current client. It provides two methods for saving and restoring state: toJSONString and fromJSONString.

The state provided by toJSONString should be stored securely, as the credentials inside could in theory let a user stay authenticated forever.

To restore an account from an existing state in shared preferences:

// Inside a `launch` or `async` block:
getSharedPreferences(FXA_STATE_PREFS_KEY, Context.MODE_PRIVATE).getString(FXA_STATE_KEY, "").let {

To persist an account's state in shared preferences:

account.toJSONString().let {
    getSharedPreferences(FXA_STATE_PREFS_KEY, Context.MODE_PRIVATE).edit().putString(FXA_STATE_KEY, it).apply()

From scratch

If no previous auth state was found, we have to create a new one using some default OAuth parameters. Find the hostname, or CONFIG_URL for your OAuth provider, then create a CLIENT_ID and REDIRECT_URL for your application. From there, we can create a Config object, and finally our FirefoxAccount object:

// Some helpers such as Config.release(CLIENT_ID, REDIRECT_URL)
// are also provided for well-known Firefox Accounts servers.
val account = FirefoxAccount(config)

Viewing the web pages

In order to complete the OAuth flow, the app can spawn a view and capture the code/state parameters in one of three ways:

  • Opening a custom tab, then capturing params via intent filters
  • Spawning a WebView with a page load hook
  • Spawning an EngineView (WebView/GeckoView) [WIP]


This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at
You can’t perform that action at this time.