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 の新しいデベロッパー コンソールと [認証] セクションでは、ユーザーを表示、変更、削除できます。これは、ログインと登録のフローをデバッグする際に非常に便利です。コンソールで認証方法の構成やメール テンプレートのカスタマイズを行うこともできます。

  • 新しい 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 で保持されます。これは、サーバーサイドのショッピング カートや、登録フローを通じてユーザーを送る前にユーザーに働きかけたいアプリケーションのような状況に適しています。

機能の違い

現在、Firebase Authentication で使用できない Identity Toolkit 機能もありますが、他の機能は再設計され、動作が異なります。これらの機能がアプリにとって重要である場合は、すぐに移行しないことを選ぶこともできます。多くの場合、これらの機能はアプリにとって重要ではないか、簡単なフォールバックによって移行を続行できる可能性があります。

サーバーサイドの違い

コア Identity Toolkit サービスとその基盤となる REST API、アカウント検証ロジック、プライマリ ユーザー データベースは、マイナー アップデートのみを行いました。ただし、一部の機能と 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 フローはすべて、Frebase 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. サービス アカウントの横にある > [鍵を作成] をクリックします。次に、[Create private key] ダイアログで、鍵のタイプを [JSON] に設定し、[Create] をクリックします。サービス アカウントの認証情報を含む 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

主な変更点

Firebase のウェブ実装には、Identity Toolkit とは異なる点がいくつかあります。

  • ウェブ セッションの管理

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

    Firebase クライアント SDK は Firebase ID トークンを管理し、Firebase Authentication のバックエンドと連携してセッションを最新の状態に保つようになりました。重要なアカウント変更(ユーザーのパスワードの変更など)が発生すると、バックエンドはセッションを期限切れにします。Firebase ID トークンは、ウェブ クライアントで Cookie として自動的に設定されず、有効期間は 1 時間のみです。1 時間だけのセッションが必要でない限り、すべてのページ リクエストを検証する Cookie として Firebase ID トークンを使用することは適切ではありません。代わりに、ユーザーがログインしたときのリスナーを設定し、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 は、マテリアル デザイン アニメーションを動的に追加するマテリアル デザイン ライトのスタイル設定を使用します。

ステップ 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 も送信されます)。次に、Firebase サーバー SDK を使用してそのトークンを検証し、バックエンド フレームワークで完了したセッション Cookie のチェックも行います。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. [概要] ページで [アプリを追加] をクリックし、[Firebase を Android アプリに追加] をクリックします。[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:23.0.0'
    compile 'com.google.android.gms:play-services-auth:21.2.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. [Overview] ページで [Add App] をクリックし、[Add Firebase to your iOS app] をクリックします。[Add Firebase] ダイアログで、アプリのバンドル ID と App Store ID を指定し、[Add App] をクリックします。これで、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 の呼び出しに置き換えます。