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、アカウント検証ロジック、プライマリ ユーザー データベースを備えた Core 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 認証

    ログイン、登録、パスワードの再設定、アカウントのリンクを管理するすべての 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] セクションで、[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 時間のセッションが必要な場合を除き、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 ウェブ 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 つの方法は、ログイン ユーザーの Firebase ID トークンを getToken() で取得し、そのトークンを各リクエストに含めることです(セッション 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:22.3.1'
    compile 'com.google.android.gms:play-services-auth:21.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 がある場合は、独自の GoogleService-Info.plist ファイルを設定できるように、各バンドル ID を Firebase コンソールで接続する必要があります。

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

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

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

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

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

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