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 は補完的な機能で構成されており、モバイル アナリティクスクラウド メッセージングリアルタイム データベースファイル ストレージ静的ホスティングリモート構成、モバイル クラッシュ レポート、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 Platform で使用できない Identity Toolkit 機能もありますが、他の機能は再設計され、動作が異なります。これらの機能がアプリにとって重要である場合は、すぐに移行しないことを選ぶこともできます。多くの場合、これらの機能はアプリにとって重要ではないか、簡単なフォールバックによって移行を続行できる可能性があります。

サーバーサイドの違い

コア 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 を使用して再構築され、ログイン ウィジェットとしてパッケージ化されています。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. サービス アカウントの横にある > [鍵を作成] をクリックします。次に、[Create private key] ダイアログで、鍵のタイプを [JSON] に設定し、[Create] をクリックします。サービス アカウントの認証情報を含む 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')
      });
      

次に、アプリのプラットフォーム(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 時間のセッションのみが必要な場合を除き、すべてのページ リクエストを検証する Cookie として ID トークンを使用することは適していません。代わりに、ユーザーがログインしたときのリスナーを設定し、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 ウィジェットは、マテリアル デザイン アニメーションを動的に追加するマテリアル デザイン ライト スタイルを使用しています。

ステップ 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 トークンの検証方法のみです。

ウェブ API リファレンスをご覧ください。

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

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

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

    <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:23.0.0'
    compile 'com.google.android.gms:play-services-auth:21.2.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] をクリックします。[Add Firebase] ダイアログで、アプリのパッケージ名と署名証明書フィンガープリントを入力して [Add App] をクリックします。これで、google-services.json 構成ファイルがパソコンにダウンロードされます。[Add Firebase] ダイアログで、アプリのバンドル ID と App Store ID を指定し、[Add App] をクリックします。GoogleService-Info.plist 構成ファイルがパソコンにダウンロードされます。プロジェクトに複数のバンドル ID がある場合は、各バンドル ID を Firebase コンソールで関連付け、固有の 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 の呼び出しに置き換えます。