Google Identity Toolkit から Firebase Authentication に移行する

最新バージョンの Google Identity Toolkit が Firebase Authenticationとしてリリースされました。 今後、Identity Toolkit の機能開発は凍結され、すべての新機能開発は Firebase Authentication で行われます。Identity Toolkit デベロッパーは、アプリで可能な限り早急に Firebase Authentication に移行することをおすすめします。ただし、Identity Toolkit は引き続き機能し、別途お知らせがない限り非推奨になることはありません。

新機能

Firebase Authentication には、Google Identity Toolkit に比べて次のような重要な機能強化がすでに施されています。

  • Firebase のすべての機能にアクセスできる

    Firebase は、質の高いアプリの迅速な開発、ユーザーベースの拡大、収益アップを支援するモバイル プラットフォームです。Firebase は、ニーズに合わせて組み合わせることができる補完的な機能で構成されており、モバイル アナリティクスCloud MessagingRealtime Databaseファイル ストレージ静的ホスティングRemote Config、モバイル クラッシュ レポート、Android テストのインフラストラクチャが含まれています。

  • UI の更新

    Google の最新の UX 調査に基づいて、UI フローを完全に再構築しました。これには、パスワードの復元、アカウントのリンク、新規アカウントと既存アカウントの区別フローが含まれます。これらのフローは、コーディングとデバッグにかなりの時間を要することがよくあります。Android の Smart Lock for Passwords と統合されており、参加アプリのログインと登録のコンバージョンが大幅に改善されています。また、アプリに合わせてテーマを簡単に変更できます。 カスタマイズ性を最大限に高めるため、Android 版と iOS 版はオープンソース化されています。

  • サーバー設定の簡素化

    デベロッパーが Firebase Authentication を使いやすくなりました。Identity Toolkit では、多くのデベロッパーがメール復元フローを実装していなかったため、ユーザーがパスワードを忘れた場合にアカウントを復元できませんでした。Firebase Authentication では、メール確認、パスワードの再設定、パスワード変更のメッセージをユーザーに送信できます。テキストはユーザーに合わせて簡単にカスタマイズできます。また、リダイレクトをホストして パスワード変更操作を完了するための UI ウィジェットをホストする必要がなくなりました。

  • 新しい管理コンソール

    Firebase に新しいデベロッパー コンソール が追加されました。[Authentication] セクションでは、ユーザーの表示、変更、削除を行うことができます。 これは、ログインと登録のフローのデバッグに非常に役立ちます。 コンソールでは、認証方法を構成したり、メール テンプレートをカスタマイズしたりすることもできます。

  • 新しい SDK

    Identity Toolkit のすべてのサーバー API が、各クライアント ライブラリ(Android、iOS、ウェブ)でネイティブに利用できるようになりました。デベロッパーは、固定の UI に縛られることなく、新規ユーザーと既存ユーザーのログインと登録、ユーザー プロパティへのアクセス、アカウントのリンク、更新、削除、パスワードのリセットなどを行うことができます。 必要に応じて、この API の上に独自のログインフローとエクスペリエンスを完全に手動で構築することもできます。

  • モバイルアプリのセッション管理

    Identity Toolkit では、アプリは Identity Toolkit からの最初の認証イベントに基づいて独自のセッション状態を作成していました。Firebase Auth は、認証イベントから生成された更新トークンを受け取り、Android、iOS、JavaScript 用の 1 時間のアクセス トークンと交換するバックエンド サービスを使用します。ユーザーがパスワードを変更すると、更新トークンで新しいアクセス トークンを生成できなくなり、ユーザーがそのデバイスで再認証するまでアクセスが無効になります。

  • 匿名認証と GitHub 認証

    Firebase Authentication では、GitHub と匿名の 2 つの新しい認証タイプがサポートされています。匿名ログインを使用すると、ユーザーがログインや登録の手続きを行うことなく、一意のユーザー ID を作成できます。匿名ユーザーは、通常のユーザーと同様に、認証済みの API 呼び出しを行うことができます。ユーザーがアカウントに登録すると、すべてのアクティビティが同じユーザー ID で保持されます。これは、サーバーサイドのショッピング カートや、登録フローにユーザーを誘導する前にユーザーにエンゲージメントしたいアプリなどに最適です。

機能の違い

Identity Toolkit の一部の機能は現在 Firebase Authentication では利用できません。また、他の機能は再設計され、動作が異なります。 これらの機能がアプリにとって重要な場合は、すぐに移行しないことを選択できます。多くの場合、これらの機能はアプリにとって重要ではないか、簡単にフォールバックできるため、移行を進めることができます。

サーバーサイドの違い

基盤となる REST API、アカウント検証ロジック、プライマリ ユーザー データベースを備えたコア Identity Toolkit サービスは、わずかな更新しか行われていません。 ただし、一部の機能と、Firebase Authentication をサービスに統合する方法は変更されています。

  • ID プロバイダ

    Paypal と AOL はサポートされていません。これらの IDP のアカウントを持つユーザーは、パスワード復元フローを使用してアプリにログインし、アカウントのパスワードを設定できます。

  • サーバー ライブラリ

    現在、Firebase Admin SDK が Java、Node.js、Python、Go、C# 用に用意されています。

  • アカウント管理メール

    パスワードのリセット、メール確認、メール変更のメッセージは、Firebase またはデベロッパー自身のメールサーバーから送信できます。現在、Firebase のメール テンプレートはカスタマイズが制限されています。

  • メールアドレス変更の確認

    Identity Toolkit では、ユーザーがメールアドレスを変更すると、メールアドレス変更フローを続行するためのリンクを含むメールが新しいアドレスに送信されます。

    Firebase は、変更を元に戻すためのリンクを含む取り消しメールを古いメールアドレスに送信することで、メールアドレスの変更を確認します。

  • IDP のロールアウト

    Identity Toolkit には、ログイン システムに ID プロバイダを段階的に追加する機能があり、サポート リクエストへの影響を試すことができました。この機能は Firebase Authentication で削除されました。

クライアント サイドの違い

Firebase では、Google Identity Toolkit が提供する機能は次の 2 つのコンポーネントに分割されています。

  • Firebase Authentication SDK

    Firebase Authentication では、Identity Toolkit の REST API が提供する機能が、Android、iOS、JavaScript で利用可能なクライアント SDK にパッケージ化されています。この SDK を使用すると、REST 呼び出しでバックエンド サービスと通信する代わりに、クライアント SDK を使用してユーザーのログインと登録、ユーザー プロファイル情報へのアクセス、アカウントのリンク、更新、削除、パスワードのリセットを行うことができます。

  • FirebaseUI Auth

    ログイン、登録、パスワードの復元、アカウントのリンクを管理するすべての UI フローが、Firebase Authentication SDK を使用して再構築されました。 これらは iOS と Android 用のオープンソース SDK として提供されており、Identity Toolkit では不可能だった方法でフローを完全にカスタマイズできます。

その他の違いは次のとおりです。

  • セッションと移行

    Identity Toolkit と Firebase Authentication ではセッションの管理方法が異なるため、SDK をアップグレードするとユーザーの既存のセッションが終了し、ユーザーは再度ログインする必要があります。

始める前に

Identity Toolkit から Firebase Authentication に移行するには、次の操作を行う必要があります。

  1. [Firebase コンソール]を開き、 [Google プロジェクトをインポート] をクリックして、Identity Toolkit プロジェクトを選択します。

  2. [ > 権限] をクリックして、 [IAM と管理] ページを開きます。

  3. [サービス アカウント] ページを開きます。ここでは、Identity Toolkit 用に以前構成したサービス アカウントを確認できます。

  4. サービス アカウントの横にある [ > 鍵を作成] をクリックします。[秘密鍵の作成] ダイアログで、[キーのタイプ] を [JSON] に設定して [作成] をクリックします。サービス アカウントの認証情報を含む JSON ファイルがダウンロードされます。次のステップで SDK を初期化するために必要になります。

  5. Firebase コンソールに戻ります。 [Authentication] セクションで [Email Templates] ページを開きます。このページで、アプリのメール テンプレートをカスタマイズします。

    Identity Toolkit では、ユーザーがパスワードをリセットしたり、メールアドレスを変更したり、メールアドレスを確認したりした場合、Identity Toolkit サーバーから OOB コードを取得し、メールでユーザーに送信する必要がありました。 Firebase は、構成したテンプレートに基づいてメールを送信します。追加の操作は必要ありません。

  6. 省略可: サーバーで Firebase サービスにアクセスする必要がある場合は、 Firebase SDK をインストールします。

    1. Firebase Node.js モジュールは npm でインストールできます。

      $ npm init
      $ npm install --save firebase-admin
      
    2. コードで Firebase にアクセスするには、次のようにします。

      var admin = require('firebase-admin');
      var app = admin.initializeApp({
        credential: admin.credential.cert('path/to/serviceAccountCredentials.json')
      });
      

次に、アプリのプラットフォーム(AndroidiOSウェブ)の移行手順を完了します。

サーバーと JavaScript

主な変更点

Identity Toolkit と Firebase のウェブ実装には、他にもいくつかの違いがあります。

  • ウェブ セッション管理

    以前は、ユーザーが Identity Toolkit ウィジェットを使用して認証すると、 セッションのブートストラップに使用される Cookie がユーザーに設定されていました。 この Cookie の有効期間は 2 週間で、ユーザーがアカウント管理ウィジェットを使用してパスワードとメールアドレスを変更できるようにするために使用されていました。一部のサイトでは、この Cookie を使用してサイト上の他のすべてのページ リクエストを認証していました。 他のサイトでは、フレームワークの Cookie 管理システムを使用して、この Cookie から独自の Cookie を作成していました。

    Firebase クライアント SDK は、Firebase ID トークン を管理し、Firebase Authentication のバックエンドと連携してセッションを最新の状態に保ちます。 バックエンドは、重要なアカウントの変更(ユーザー パスワードの変更など)が発生するとセッションを期限切れにします。Firebase ID トークンは、ウェブ クライアントで Cookie として自動的に設定されず、有効期間は 1 時間のみです。セッションを 1 時間のみにしたい場合を除き、Firebase ID トークンをすべてのページ リクエストを検証する Cookie として使用することは適切ではありません。代わりに、ユーザーがログインしたときにリスナーを設定し、Firebase ID トークンを取得して検証し、フレームワークの Cookie 管理システムを使用して独自の Cookie を作成する必要があります。

    Cookie のセッション有効期間は、アプリのセキュリティ要件に基づいて設定する必要があります。

  • ウェブ ログインフロー

    以前は、ログインが開始されると、ユーザーが使用する ID を確認するために accountchooser.com にリダイレクトされていました。Firebase Auth UI のフローは、ログイン方法のリストから始まります。メール オプションを選択すると、ウェブの場合は accountchooser.com に移動し、Android の場合は hintRequest API を使用します。また、Firebase UI でメールアドレスは不要になりました。これにより、匿名ユーザー、カスタム認証ユーザー、メールアドレスが不要なプロバイダのユーザーを簡単にサポートできるようになります。

  • アカウント管理ウィジェット

    このウィジェットは、ユーザーがメールアドレスの変更、パスワードの変更、アカウントと ID プロバイダのリンク解除を行うための UI を提供します。現在開発中です。

  • ログインボタン/ウィジェット

    ログインボタンやユーザーカードなどのウィジェットは提供されなくなりました。Firebase Authentication API を使用すると、簡単に構築できます。

  • signOutUrl がない

    firebase.auth.signOut() を呼び出して、コールバックを処理する必要があります。

  • oobActionUrl がない

    メールの送信は Firebase によって処理され、Firebase コンソールで構成されます。

  • CSS のカスタマイズ

    FirebaseUI は Material Design Lite のスタイル設定を使用しており、 マテリアル デザイン のアニメーションが動的に追加されます。

ステップ 1: サーバーコードを変更する

  1. サーバーが Identity Toolkit トークン(有効期間 2 週間)に依存してウェブユーザー セッションを管理している場合は、サーバーを変換して独自のセッション Cookie を使用する必要があります。

    1. Firebase ID トークンを検証して ユーザーのセッション Cookie を設定するエンドポイントを実装します。クライアント アプリはこのエンドポイントに Firebase ID トークンを送信します。
    2. 受信リクエストに独自のセッション Cookie が含まれている場合は、ユーザーが認証済みと見なすことができます。それ以外の場合は、リクエストを未認証として扱います。
    3. ユーザーが既存のログイン セッションを失わないようにするには、すべての Identity Toolkit トークンが期限切れになるまで 2 週間待つか、ステップ 3 で説明するように、ウェブアプリのデュアル トークン検証も行います。
  2. 次に、Firebase トークンは Identity Toolkit トークンとは異なるため、トークン検証ロジックを更新する必要があります。Firebase Server SDK をサーバーにインストールします。または、Firebase Server SDK でサポートされていない 言語を使用している場合は、環境用の JWT トークン検証ライブラリ をダウンロードして、トークンを適切に 検証します。

  3. 上記の更新を最初に行うときは、Identity Toolkit トークンに依存するコードパスが残っている可能性があります。iOS アプリまたは Android アプリがある場合は、新しいコードパスを機能させるために、ユーザーがアプリの新しいバージョンにアップグレードする必要があります。ユーザーにアプリの更新を強制したくない場合は、トークンを検証し、トークンの検証に Firebase SDK または Identity Toolkit SDK のどちらを使用する必要があるかを判断する追加のサーバー検証ロジックを追加できます。ウェブアプリのみを使用している場合は、すべての新しい認証リクエストが Firebase に移行されるため、Firebase トークン検証メソッドのみを使用する必要があります。

Firebase Web API リファレンスをご覧ください。

ステップ 2: HTML を更新する

  1. Firebase 初期化コードをアプリに追加します。

    1. Firebase コンソールでプロジェクトを開きます。
    2. [概要] ページで [**アプリを追加**] をクリックし、[**ウェブアプリに Firebase を追加**] をクリックします。Firebase を初期化するコード スニペットが表示されます。
    3. 初期化スニペットをコピーしてウェブページに貼り付けます。
  2. アプリに FirebaseUI Auth を追加します。

    <script src="https://www.gstatic.com/firebasejs/ui/live/0.4/firebase-ui-auth.js"></script>
    <link type="text/css" rel="stylesheet" href="https://www.gstatic.com/firebasejs/ui/live/0.4/firebase-ui-auth.css" />
    <!-- *******************************************************************************************
       * TODO(DEVELOPER): Paste the initialization snippet from:
       * Firebase Console > Overview > Add Firebase to your web app. *
       ***************************************************************************************** -->
    <script type="text/javascript">
      // FirebaseUI config.
      var uiConfig = {
        '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
        ],
        // Terms of service url.
        'tosUrl': '<your-tos-url>',
      };
    
      // Initialize the FirebaseUI Widget using Firebase.
      var ui = new firebaseui.auth.AuthUI(firebase.auth());
      // The start method will wait until the DOM is loaded.
      ui.start('#firebaseui-auth-container', uiConfig);
    </script>
    
  3. アプリから Identity Toolkit SDK を削除します。

  4. セッション管理に Identity Toolkit ID トークンを使用していた場合は、クライアント サイドで次の変更を行う必要があります。

    1. Firebase でログインに成功したら、firebase.auth().currentUser.getToken() を呼び出して Firebase ID トークンを取得します。

    2. Firebase ID トークンをバックエンド サーバーに送信して検証し、独自のセッション Cookie を発行します。

      機密性の高いオペレーションを実行する場合や、認証済みの編集リクエストをサーバーに送信する場合は、セッション Cookie のみに依存しないでください。クロスサイト リクエスト フォージェリ(CSRF)保護を追加する必要があります。

      フレームワークで CSRF 保護が提供されていない場合は、攻撃を防ぐ方法として、getToken() を使用してログイン済みユーザーの Firebase ID トークンを取得し、各リクエストにトークンを含めることができます(セッション Cookie もデフォルトで送信されます)。次に、バックエンド フレームワークが完了したセッション Cookie チェックに加えて、Firebase Server SDK を使用してそのトークンを検証します。Firebase ID トークンはウェブ ストレージにのみ保存され、Cookie には保存されないため、CSRF 攻撃が成功しにくくなります。

    3. Identity Toolkit トークンの有効期間は 2 週間です。2 週間有効なトークンを引き続き発行することも、アプリのセキュリティ要件に基づいて有効期間を長くしたり短くしたりすることもできます。ユーザーがログアウトしたら、セッション Cookie をクリアします。

ステップ 3: IDP リダイレクト URL を更新する

  1. Firebase コンソールで [Authentication] セクションを開き、[ログイン方法] タブをクリックします。

  2. サポートしているフェデレーション ログイン プロバイダごとに、次の操作を行います。

    1. ログイン プロバイダの名前をクリックします。
    2. OAuth リダイレクト URI をコピーします。
    3. ログイン プロバイダのデベロッパー コンソールで、OAuth リダイレクト URI を更新します。

Android

ステップ 1: Firebase をアプリに追加する

  1. Firebase コンソールを開き、 すでにインポートした Identity Toolkit プロジェクトを選択します。

  2. [概要] ページで [**アプリを追加**] をクリックし、[**Android アプリに Firebase を追加**] をクリックします。[Firebase を追加] ダイアログで、アプリのパッケージ名と署名証明書のフィンガープリントを入力して [**アプリを追加**] をクリックします。google-services.json 構成ファイルがパソコンにダウンロードされます。

  3. 構成ファイルを Android アプリのモジュール ルート ディレクトリにコピーします。この構成ファイルには、プロジェクトと Google OAuth クライアントの情報が含まれています。

  4. プロジェクト レベルの build.gradle ファイル (<var>your-project</var>/build.gradle)の defaultConfig セクションで、アプリのパッケージ名を指定します。

    defaultConfig {
       …..
      applicationId "com.your-app"
    }
    
  5. プロジェクト レベルの build.gradle ファイルで、google-services プラグインを含める依存関係を追加します。

    buildscript {
     dependencies {
       // Add this line
       classpath 'com.google.gms:google-services:3.0.0'
     }
    }
    
  6. アプリのアプリレベルの build.gradle ファイル (<var>my-project</var>/<var>app-module</var>/build.gradle)で、次の行を末尾に追加して google-services プラグインを有効にします。

    // Add to the bottom of the file
    apply plugin: 'com.google.gms.google-services'
    

    google-services プラグインは、google-services.json ファイルを使用して、Firebase を使用するようにアプリを構成します。

  7. アプリレベルの build.gradle ファイルで、Firebase Authentication の依存関係を追加します。

    compile 'com.google.firebase:firebase-auth:24.2.0'
    compile 'com.google.android.gms:play-services-auth:22.0.0'
    

ステップ 2: Identity Toolkit SDK を削除する

  1. AndroidManifest.xml ファイルから Identity Toolkit の構成を削除します。この情報は google-service.json ファイルに含まれており、google-services プラグインによって読み込まれます。
  2. アプリから Identity Toolkit SDK を削除します。

ステップ 3: アプリに FirebaseUI を追加する

  1. アプリに FirebaseUI Auth を追加します。

  2. アプリで、Identity Toolkit SDK の呼び出しを FirebaseUI の呼び出しに置き換えます。

iOS

ステップ 1: Firebase をアプリに追加する

  1. 次のコマンドを実行して、アプリに Firebase SDK を追加します。

    $ cd your-project directory
    $ pod init
    $ pod 'Firebase'
    
  2. Firebase コンソールを開き、 すでにインポートした Identity Toolkit プロジェクトを選択します。

  3. [概要] ページで [**アプリを追加**] をクリックし、[**iOS アプリに Firebase を追加**] をクリックします。[Firebase を追加] ダイアログで、アプリのバンドル ID と App Store ID を入力して [**アプリを追加**] をクリックします。GoogleService-Info.plist 構成ファイルがパソコンにダウンロードされます。プロジェクトに複数のバンドル ID がある場合は、Firebase コンソールで各バンドル ID を接続して、独自の GoogleService-Info.plist ファイルを設定できるようにする必要があります。

  4. 構成ファイルを Xcode プロジェクトのルートにコピーし、すべてのターゲットに追加します。

ステップ 2: Identity Toolkit SDK を削除する

  1. アプリの Podfile から GoogleIdentityToolkit を削除します。
  2. pod install コマンドを実行します。

ステップ 3: アプリに FirebaseUI を追加する

  1. アプリに FirebaseUI Auth を追加します。

  2. アプリで、Identity Toolkit SDK の呼び出しを FirebaseUI の呼び出しに置き換えます。