Google Identity Toolkit から Google Cloud Identity Platform に移行する

Google Identity Toolkit の最新バージョンは、Identity PlatformFirebase Authentication としてリリースされています。今後、Identity Toolkit の機能は凍結され、新機能の開発はすべて Identity Platform と Firebase Authentication で行われます。Identity Toolkit のデベロッパーには、アプリケーションにとって実用的になり次第、これらのプラットフォームに移行することをおすすめします。

新機能

Identity Platform では、Google Identity Toolkit に比べてすでに大幅な機能強化が行われています。

  • 新しい管理コンソール

    Identity Platform に備わっている新しいデベロッパー コンソールを使用すると、ユーザーを表示、変更、削除できます。ログインと登録のフローのデバッグに役立ちます。コンソールでは、認証方法の構成やメール テンプレートのカスタマイズを行うこともできます。

  • 新しい認証方法

    Identity Platform は SAML や OIDC などのエンタープライズ フェデレーション標準をサポートしているため、SaaS アプリとサービスをスケーリングできます。Identity Platform では、GitHub、Microsoft、Yahoo などのプロバイダもサポートしています。匿名ログインを使用すると、ログインや登録などのプロセスを行わなくても一意のユーザー ID を作成できます。これにより、通常のユーザーの場合と同様に、認証された API 呼び出しを行うことができます。ユーザーがアカウントに登録すると、すべてのアクティビティが同じユーザー ID で保持されます。これは、サーバーサイドのショッピング カートやその他のアプリケーションなど、登録フローを送信する前にユーザーを引きつけたいシナリオで役立ちます。

  • サービスレベル契約とクラウド サポートで信頼性の高いスケーリングを実現

    Identity Platform は信頼できる Google インフラストラクチャ上に構築されており、Google Cloud によるサービスレベル契約とサポートを提供します。つまり、信頼性の高い方法でサービスをスケーリングでき、必要な復元力、可用性、スケーラビリティを Google が約束します。

  • Firebase のすべてにアクセス

    Firebase は、質の高いアプリの迅速な開発、ユーザーベースの拡大、収益アップを支援するモバイル プラットフォームです。Firebase は、ニーズに合わせて組み合わせて使用できる補完的な機能から構成されており、モバイル アナリティクスクラウド メッセージングリアルタイム データベースファイル ストレージ静的ホスティングリモート構成、モバイルクラッシュ レポート、Android テストのインフラストラクチャを備えています。

  • 更新された UI

    UI フローは、Google の最新の UX 研究に基づいて完全に再構築されました。これには、パスワードの再設定、アカウントのリンク、新規または既存のアカウント確認フローなどがあり、多くの場合、コーディングとデバッグにかなりの時間がかかります。Android で Smart Lock for Passwords を統合し、対象のアプリのログインと登録のコンバージョンを大幅に改善しました。また、アプリケーションに合わせて簡単にテーマを変更でき、最大限のカスタマイズ性を実現するため、Android 版と iOS 版はオープンソース化されています。

  • シンプルなサーバー設定

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

  • 新しい SDK

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

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

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

機能の違い

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

サーバー側の違い

コア Identity Toolkit サービスとその基盤となる REST API、アカウント検証ロジック、プライマリ ユーザー データベースには、マイナー アップデートのみが行われました。ただし、一部の機能と Identity Platform をサービスに統合する方法が変更されました。

  • ID プロバイダ

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

  • サーバー ライブラリ

    現在、Java、Node.js、Python、Go、C# に対応した Admin SDK が提供されています。

  • アカウント管理メール

    パスワードの再設定、メールの確認、メール変更のメッセージは、Firebase またはデベロッパー独自のメールサーバーから実行できます。現在、メール テンプレートの UI からのカスタマイズは限定されていますが、Admin SDK を使用してさらにカスタマイズできます。

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

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

    Firebase は、変更を元に戻すリンクが記載された取り消しメールを古いメールアドレスに送信して、メールアドレスの変更を確認します。

  • IdP のロールアウト

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

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

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

  • クライアント SDK とサーバー SDK

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

  • UI ウィジェット

    ログイン、登録、パスワードの再設定、アカウントのリンクを管理するすべての UI フローが、Client SDK を使用して再構築され、ログイン ウィジェットとしてパッケージ化されています。これらの SDK は iOSAndroidウェブ用のオープンソース SDK として提供されており、Identity Toolkit では不可能な方法でフローを完全にカスタマイズできます。

その他にも次のような違いがあります。

  • セッションと移行

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

始める前に

Identity Toolkit から Identity Platform に移行する前に、次のことを行う必要があります。

  1. Cloud コンソールを開き、Identity Toolkit プロジェクトを選択します。

  2. Marketplace から [Identity Platform] を選択し、[Identity Platform を有効にする] を選択します。

  3. サービス アカウント] ページを開きます。ここには、Identity Toolkit 用に構成したサービス アカウントが表示されます。

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

  5. Cloud コンソールに戻ります。[プロバイダ] セクションの [メール/パスワード] ログイン方法で、[メール テンプレート] ページを開きます。その後、アプリのテンプレートをカスタマイズできます。

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

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

    1. npm を使用して Node.js Admin SDK をインストールできます。

      $ 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 Platform のウェブ実装と Identity Toolkit のウェブ実装には、他にもいくつかの違いがあります。

  • ウェブ セッション管理

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

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

    アプリケーションのセキュリティ ニーズに基づいて、Cookie のセッション存続期間を設定する必要があります。

  • ウェブログインフロー

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

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

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

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

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

  • signOutUrl がない

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

  • oobActionUrl がない

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

  • CSS のカスタマイズ

    UI ウィジェットは、マテリアル デザイン アニメーションを動的に追加するマテリアル デザイン Lite スタイル設定を使用しています。

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

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

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

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

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

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

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

    1. Cloud コンソールでプロジェクトを開きます。
    2. [プロバイダ] ページで、[アプリケーション設定の詳細] をクリックします。Identity Platform を初期化するコード スニペットが表示されます。
    3. 初期化スニペットをコピーしてウェブページに貼り付けます。
  2. アプリに認証ウィジェットを追加します。

    <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. Identity Platform で正常にログインしたら、firebase.auth().currentUser.getToken() を呼び出して ID トークンを取得します。

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

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

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

    3. Identity Toolkit トークンの有効期間は 2 週間です。2 週間持続するトークンの発行を継続する場合や、アプリのセキュリティ要件に基づいて期間を長くしたり短くしたりしたい場合もあるでしょう。ユーザーがログアウトしたら、セッション Cookie を消去します。

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

  1. Cloud コンソールで [プロバイダ] セクションを開きます。

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

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

Android

ステップ 1: Firebase を使用して Identity Platform をアプリに追加する

  1. Cloud コンソールを開き、Identity Toolkit プロジェクトを選択します。

  2. [Providers] ページで [Application setup details] をクリックし、[Android] タブを選択して、[Get Started in 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)で、Android Gradle プラグインの後に次の行を追加して、google-services プラグインを有効にします。

    apply plugin: 'com.android.application'
    // Add this line
    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. 次のコマンドを実行して、アプリにクライアント SDK を追加します。

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

  3. [プロバイダ] ページで [アプリケーション設定の詳細] をクリックし、[iOS] タブを選択して、[Firebase で始める] をクリックします。[Firebase を追加] ダイアログで、アプリのパッケージ名と署名証明書フィンガープリントを指定し、[アプリを追加] をクリックします。google-services.json 構成ファイルがパソコンにダウンロードされます。[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 の呼び出しに置き換えます。