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 Messaging、Realtime Database、ファイル ストレージ、静的ホスティング、リモート構成、モバイルクラッシュ レポート、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 では使用できません。また、他の機能は再設計され、動作が異なります。これらの機能がアプリにとって重要である場合は、すぐに移行しないことを選択できます。多くの場合、これらの機能はアプリにとって重要ではないか、移行を進めることができる簡単な代替手段がある可能性があります。

サーバーサイドの違い

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

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

    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')
      });
      

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

サーバーと JavaScript

主な変更点

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

  • ウェブ セッション管理

    以前は、ユーザーが 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 保護が提供されていない場合、攻撃を防ぐ方法の 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:25.0.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 とアプリストア ID を入力し、[アプリを追加] をクリックします。GoogleService-Info.plist 構成ファイルがパソコンにダウンロードされます。プロジェクトに複数のバンドル ID がある場合は、Firebase コンソールで各バンドル ID を接続して、各バンドル 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 の呼び出しに置き換えます。