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 の更新

    Google の最新の UX 調査に基づいて、UI フローを完全に再構築しました。これには、パスワードの復元、アカウントのリンク、新しいアカウントと既存のアカウントの区別フローが含まれます。これらのフローのコード化とデバッグには、多くの場合、かなりの時間がかかることがあります。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 フローは、クライアント 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 コンソールに戻ります。[Providers] セクションの [Email/Password] ログイン方法で、[Email Templates] ページを開きます。その後、アプリのテンプレートをカスタマイズできます。

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

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

    1. Node.js Admin SDK は 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 Platform のウェブ実装には、Identity Toolkit と多くの違いがあります。

  • ウェブ セッション管理

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

    Identity Platform Client 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 ウィジェットは Material Design 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 にのみ依存しないでください。クロスサイト リクエスト フォージェリ(CSRF)の保護を追加する必要があります。

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

    3. Identity Toolkit トークンの有効期間は 2 週間です。2 週間有効なトークンを継続して発行することも、アプリのセキュリティ要件に基づいてトークンの有効期間を長くしたり短くしたりすることもできます。ユーザーがログアウトすると、セッション クッキーを削除します。

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

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

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

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

Android

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

  1. Cloud コンソールを開き、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)で、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:23.1.0'
    compile 'com.google.android.gms:play-services-auth:21.3.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. [Provider] ページで [Application setup details] をクリックし、[iOS] タブを選択して、[Get Started in Firebase] をクリックします。[Firebase を追加] ダイアログで、アプリのパッケージ名と署名証明書フィンガープリントを指定し、[アプリを追加] をクリックします。google-services.json 構成ファイルがコンピュータにダウンロードされます。[Firebase を追加] ダイアログで、アプリのバッチ ID と App Store ID を指定し、[アプリを追加] をクリックします。GoogleService-Info.plist 構成ファイルがパソコンにダウンロードされます。プロジェクトに複数のバンドル ID がある場合は、各バンドル ID に独自の GoogleService-Info.plist ファイルを設定できるように、Firebase コンソールで各バンドル ID を接続する必要があります。

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

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

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

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

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

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