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

Google Identity Toolkit の最新バージョンは、Identity Platform と Firebase 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 で保持されます。これは、サーバーサイドのショッピング カートや、ユーザーを登録フローに誘導する前にユーザーを引き付けたいその他のアプリケーションなどのシナリオで役立ちます。

  • サービスレベル契約と Cloud サポートにより、安心してスケーリング

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

  • Firebase のすべての機能にアクセス

    Firebase は、質の高いアプリの迅速な開発、ユーザーベースの拡大、収益アップを支援するモバイル プラットフォームです。Firebase は、ニーズに合わせて組み合わせて使用できる補完的な機能で構成されており、モバイルアナリティクス、Cloud Messaging、Realtime Database、ファイル ストレージ、静的ホスティング、リモート構成、モバイルクラッシュ レポート、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 フローが、Client SDK を使用して再構築され、ログイン ウィジェットとしてパッケージ化されています。これらは、iOS、Android、ウェブ用のオープンソース 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. 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')
      });
      

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

サーバーと JavaScript

主な変更点

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

  • ウェブ セッション管理

    以前は、ユーザーが 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 ウィジェットは、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 を発行します。

      機密性の高い操作を実行する場合や、認証済みの編集リクエストをサーバーに送信する場合は、セッション 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] をクリックします。[Add Firebase] ダイアログで、アプリのパッケージ名と証明書フィンガープリントを入力し、[Add App] をクリックします。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: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. 次のコマンドを実行して、クライアント SDK をアプリに追加します。

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

  3. [Providers] ページで [Application setup details] をクリックし、[iOS] タブを選択して、[Get Started in Firebase] をクリックします。[Firebase を追加] ダイアログで、アプリのパッケージ名と署名証明書のフィンガープリントを入力し、[アプリを追加] をクリックします。google-services.json 構成ファイルがパソコンにダウンロードされます。[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 の呼び出しに置き換えます。