FirebaseUI でウェブアプリに簡単にログイン機能を追加する

FirebaseUI は Firebase Authentication SDK の上に構築されるライブラリで、アプリで使用するドロップイン UI フローを提供します。FirebaseUI には次のようなメリットがあります。

  • 複数のプロバイダに対応 - メールのログインフロー、電話認証、Google、Facebook、Twitter、GitHub によるログインに対応しています。
  • アカウントのリンク - ID プロバイダ間でユーザー アカウントを安全にリンクできます。
  • カスタマイズ - アプリの要件に合わせて FirebaseUI の CSS スタイルを変更できます。FirebaseUI はオープンソースであるため、必要に応じてプロジェクトをフォークしてカスタマイズすることもできます。
  • ワンタップ登録と自動ログイン - ワンタップ登録を使用した自動統合により、迅速なクロスデバイス ログインを実現します。
  • ローカライズされた UI - 国際化によって 40 以上の言語に対応しています。
  • 匿名ユーザーのアップグレード - ログイン / 登録による匿名ユーザーのアップグレード機能。詳細については、匿名ユーザーのアップグレード セクションをご覧ください。

準備

  1. ウェブ アプリケーションに Firebase Authentication を追加します

  2. 次のいずれかのオプションを使用して FirebaseUI を追加します。

    1. CDN

      ページの <head> タグの中、Firebase コンソールの初期化スニペットの下に、次のスクリプトと CSS ファイルを含めます。

      <script src="https://cdn.firebase.com/libs/firebaseui/2.5.1/firebaseui.js"></script>
      <link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/2.5.1/firebaseui.css" />
      
    2. npm モジュール

      次のコマンドを使用し、npm を通じて FirebaseUI とその依存関係をインストールします。

      $ npm install firebaseui --save
      

      ソースファイルの中で、次のモジュールに対して require を実行します。

      var firebase = require('firebase');
      var firebaseui = require('firebaseui');
      
    3. Bower コンポーネント

      次のコマンドを使用し、Bower を通じて FirebaseUI とその依存関係をインストールします。

      $ bower install firebaseui --save
      

      HTML の中に必要なファイルを含めます。HTTP サーバーが bower_components/ 内のファイルを提供する場合の例を以下に示します。

      <script src="bower_components/firebaseui/dist/firebaseui.js"></script>
      <link type="text/css" rel="stylesheet" href="bower_components/firebaseui/dist/firebaseui.css" />
      

ログイン方法を設定する

Firebase を使用してログインできるようにするには、事前にサポートするログイン方法を有効にして設定しておく必要があります。

メールアドレスとパスワード

  1. Firebase コンソールで [Authentication] セクションを開き、メールとパスワードによる認証を有効にします。

  2. FirebaseUI signInOptions のリストにメール プロバイダ ID を追加します。

    ui.start('#firebaseui-auth-container', {
      signInOptions: [
        firebase.auth.EmailAuthProvider.PROVIDER_ID
      ],
      // Other config options...
    });
    
  3. 省略可: EmailAuthProvider を構成して、ユーザーに表示名の入力を求めることができます(デフォルトは true)。

    ui.start('#firebaseui-auth-container', {
      signInOptions: [
        {
          provider: firebase.auth.EmailAuthProvider.PROVIDER_ID,
          requireDisplayName: false
        }
      ]
    });
    

OAuth プロバイダ(Google、Facebook、Twitter、GitHub)

  1. Firebase コンソールで [Authentication] セクションを開き、指定した OAuth プロバイダのログインを有効にします。対応する OAuth クライアント ID とシークレットも指定します。

  2. また、[Authentication] セクションで、ログインページがレンダリングされるドメインを承認対象ドメインとしてホワイトリストに登録します。

  3. FirebaseUI signInOptions のリストに OAuth プロバイダ ID を追加します。

    ui.start('#firebaseui-auth-container', {
      signInOptions: [
        // List of OAuth providers supported.
        firebase.auth.GoogleAuthProvider.PROVIDER_ID,
        firebase.auth.FacebookAuthProvider.PROVIDER_ID,
        firebase.auth.TwitterAuthProvider.PROVIDER_ID,
        firebase.auth.GithubAuthProvider.PROVIDER_ID
      ],
      // Other config options...
    });
    
  4. 省略可: プロバイダごとにカスタム スコープまたはカスタム OAuth パラメータを指定するには、プロバイダ値だけを渡すのではなく、オブジェクトを渡します。

    ui.start('#firebaseui-auth-container', {
      signInOptions = [
        {
          provider: firebase.auth.GoogleAuthProvider.PROVIDER_ID,
          scopes: [
            'https://www.googleapis.com/auth/plus.login'
          ],
          customParameters: {
            // Forces account selection even when one account
            // is available.
            prompt: 'select_account'
          }
        },
        {
          provider: firebase.auth.FacebookAuthProvider.PROVIDER_ID,
          scopes: [
            'public_profile',
            'email',
            'user_likes',
            'user_friends'
          ],
          customParameters: {
            // Forces password re-entry.
            auth_type: 'reauthenticate'
          }
        },
        firebase.auth.TwitterAuthProvider.PROVIDER_ID, // Twitter does not support scopes.
        firebase.auth.EmailAuthProvider.PROVIDER_ID // Other providers don't need to be given as object.
      ]
    });
    

電話番号

  1. Firebase コンソールで [Authentication] セクションを開き、電話番号ログインを有効にします。

  2. ログインページがレンダリングされるドメインも承認対象ドメインとしてホワイトリストに登録されていることを確認します。

  3. FirebaseUI signInOptions のリストに電話番号プロバイダ ID を追加します。

    ui.start('#firebaseui-auth-container', {
      signInOptions = [
        firebase.auth.PhoneAuthProvider.PROVIDER_ID
      ],
      // Other config options...
    });
    
  4. 省略可: PhoneAuthProvider でカスタムの reCAPTCHA パラメータを使用して、reCAPTCHA の表示または非表示を設定できます(デフォルトは normal)。詳しくは reCAPTCHA API のドキュメントをご覧ください。

    電話番号の入力で選択されるデフォルトの国も設定できます。国コードの完全なリストについては、サポートされている国コードのリストをご覧ください。未指定の場合、電話番号の入力はデフォルトで米国(+1)になります。

    現時点でサポートされているオプションは次のとおりです。

    ui.start('#firebaseui-auth-container', {
      signInOptions = [
        {
          provider: firebase.auth.PhoneAuthProvider.PROVIDER_ID,
          recaptchaParameters: {
            type: 'image', // 'audio'
            size: 'normal', // 'invisible' or 'compact'
            badge: 'bottomleft' //' bottomright' or 'inline' applies to invisible.
          },
          defaultCountry: 'GB', // Set default country to the United Kingdom (+44).
          // For prefilling the national number, set defaultNationNumber.
          // This will only be observed if only phone Auth provider is used since
          // for multiple providers, the NASCAR screen will always render first
          // with a 'sign in with phone number' button.
          defaultNationalNumber: '1234567890',
          // You can also pass the full phone number string instead of the
          // 'defaultCountry' and 'defaultNationalNumber'. However, in this case,
          // the first country ID that matches the country code will be used to
          // populate the country selector. So for countries that share the same
          // country code, the selected country may not be the expected one.
          // In that case, pass the 'defaultCountry' instead to ensure the exact
          // country is selected. The 'defaultCountry' and 'defaultNationaNumber'
          // will always have higher priority than 'loginHint' which will be ignored
          // in their favor. In this case, the default country will be 'GB' even
          // though 'loginHint' specified the country code as '+1'.
          loginHint: '+11234567890'
        }
      ]
    });
    

ログイン

FirebaseUI のログインフローを開始するには、基盤となる Auth インスタンスを渡して FirebaseUI インスタンスを初期化します。

// Initialize the FirebaseUI Widget using Firebase.
var ui = new firebaseui.auth.AuthUI(firebase.auth());

FirebaseUI のログイン ウィジェットがレンダリングされる HTML 要素を定義します。

<!-- The surrounding HTML is left untouched by FirebaseUI.
     Your app may use that space for branding, controls and other customizations.-->
<h1>Welcome to My Awesome App</h1>
<div id="firebaseui-auth-container"></div>
<div id="loader">Loading...</div>

FirebaseUI の設定を指定します(サポートするプロバイダ、UI のカスタマイズ、成功時のコールバックなど)。

var uiConfig = {
  callbacks: {
    signInSuccessWithAuthResult: function(authResult, redirectUrl) {
      // User successfully signed in.
      // Return type determines whether we continue the redirect automatically
      // or whether we leave that to developer to handle.
      return true;
    },
    uiShown: function() {
      // The widget is rendered.
      // Hide the loader.
      document.getElementById('loader').style.display = 'none';
    }
  },
  // Will use popup for IDP Providers sign-in flow instead of the default, redirect.
  signInFlow: 'popup',
  signInSuccessUrl: '<url-to-redirect-to-on-success>',
  signInOptions: [
    // Leave the lines as is for the providers you want to offer your users.
    firebase.auth.GoogleAuthProvider.PROVIDER_ID,
    firebase.auth.FacebookAuthProvider.PROVIDER_ID,
    firebase.auth.TwitterAuthProvider.PROVIDER_ID,
    firebase.auth.GithubAuthProvider.PROVIDER_ID,
    firebase.auth.EmailAuthProvider.PROVIDER_ID,
    firebase.auth.PhoneAuthProvider.PROVIDER_ID
  ],
  // Terms of service url.
  tosUrl: '<your-tos-url>'
};

最後に、FirebaseUI Auth のインターフェースをレンダリングします。

// The start method will wait until the DOM is loaded.
ui.start('#firebaseui-auth-container', uiConfig);

匿名ユーザーのアップグレード

匿名ユーザーのアップグレードを有効にする

匿名ユーザーが永久アカウントにログインまたは登録する際に、登録する前に自分が行っていたことを続行できるようにしたいと考えています。これを行うには、ログイン UI を構成するときに autoUpgradeAnonymousUserstrue に設定するだけです(このオプションはデフォルトでは無効になっています)。

匿名ユーザーのアップグレードの統合における競合の処理

最初に匿名でログインしたユーザーが、既存の Firebase ユーザーにアップグレードしようとするケースがあります。既存のユーザーが既存の別のユーザーにリンクすることはできないため、Firebase UI では上記のエラーが発生したときに firebaseui/anonymous-upgrade-merge-conflict というエラーコードで signInFailure コールバックをトリガーします。エラー オブジェクトには、永続的な認証情報も含まれています。ログインを完了するには、永続的な認証情報によるログインがコールバックでトリガーされる必要があります。auth.signInWithCredential(error.credential) によってログインを完了する前に、匿名ユーザーのデータを保存して匿名ユーザーを削除する必要があります。ログインの完了後、データを匿名以外のユーザーにコピーします。次の例では、このフローがどのように機能するかを示しています。

// Temp variable to hold the anonymous user data if needed.
var data = null;
// Hold a reference to the anonymous current user.
var anonymousUser = firebase.auth().currentUser;
ui.start('#firebaseui-auth-container', {
  // Whether to upgrade anonymous users should be explicitly provided.
  // The user must already be signed in anonymously before FirebaseUI is
  // rendered.
  autoUpgradeAnonymousUsers: true,
  signInSuccessUrl: '<url-to-redirect-to-on-success>',
  signInOptions: [
    firebase.auth.GoogleAuthProvider.PROVIDER_ID,
    firebase.auth.FacebookAuthProvider.PROVIDER_ID,
    firebase.auth.EmailAuthProvider.PROVIDER_ID,
    firebase.auth.PhoneAuthProvider.PROVIDER_ID
  ],
  callbacks: {
    // signInFailure callback must be provided to handle merge conflicts which
    // occur when an existing credential is linked to an anonymous user.
    signInFailure: function(error) {
      // For merge conflicts, the error.code will be
      // 'firebaseui/anonymous-upgrade-merge-conflict'.
      if (error.code != 'firebaseui/anonymous-upgrade-merge-conflict') {
        return Promise.resolve();
      }
      // The credential the user tried to sign in with.
      var cred = error.credential;
      // Copy data from anonymous user to permanent user and delete anonymous
      // user.
      // ...
      // Finish sign-in after data is copied.
      return firebase.auth().signInWithCredential(cred);
    }
  }
});

次のステップ

  • FirebaseUI の使用とカスタマイズについて詳しくは、README をご覧ください。
  • FirebaseUI で見つかった問題を報告するには、GitHub の [Issues] タブを使用してください。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。