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 は、ニーズに合わせて組み合わせることができる補完的な機能で構成されており、モバイル アナリティクスクラウド メッセージングリアルタイム データベースファイル ストレージ静的ホスティングリモート構成、モバイル クラッシュ レポート、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 のアカウントを持つユーザーは、パスワード復元フローを使用してアプリにログインし、アカウントのパスワードを設定できます。

  • サーバー ライブラリ

    現在、Java、Node.js、Python、Go、C# で Firebase Admin SDK を使用できます。

  • アカウント管理に関するメール

    パスワードの再設定、メールアドレスの確認、メールアドレスの変更のメッセージは、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 コンソールに戻ります。[Auth] セクションで、[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 のセッションの有効期間を設定する必要があります。

  • ウェブログイン フロー

    以前は、ログインが開始されると、ユーザーが使用したい識別子を把握するために 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 保護が提供されていない場合、攻撃を防ぐ方法の 1 つとして、getToken() を使用してログイン ユーザーの Firebase ID トークンを取得し、各リクエストにトークンを含める方法があります(セッション Cookie もデフォルトで送信されます)。その後、バックエンド フレームワークが完了したセッション Cookie のチェックに加えて、Firebase サーバー 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.0.1'
    compile 'com.google.android.gms:play-services-auth:21.4.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 がある場合は、各バンドル ID を Firebase コンソールで接続して、独自の 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 の呼び出しに置き換えます。