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 には、新しいデベロッパー コンソールがあり、これを使用してユーザーを表示、変更、削除できます。これは、ログインフローと登録フローのデバッグに役立ちます。Console では、認証方法の構成とメール テンプレートのカスタマイズも可能です。

  • 新しい認証方法

    Identity Platform は、SAML や OIDC などのエンタープライズ連携標準をサポートしているため、SaaS アプリとサービスをスケーリングできます。Identity Platform は、GitHub、Microsoft、Yahoo などのプロバイダに対するサポートも提供しています。匿名ログインを使用すると、ユーザーにログインや登録プロセスを要求せずに、一意のユーザー ID を作成できます。これにより、通常のユーザーの場合と同様に、認証済みの API 呼び出しを行うことができます。ユーザーが登録することにした場合、すべてのアクティビティは同じユーザー ID で保持されます。これは、登録フローを通じてユーザーを送信する前にサーバーサイドのショッピング カートのような状況でユーザーを引き付ける必要がある場合に便利です。

  • サービスレベル契約と Cloud サポートを利用して安心してスケーリング

    Identity Platform は信頼できる Google インフラストラクチャ上に構築されており、Google のサービスレベル契約とサポートを提供します。つまり、安心してサービスをスケーリングでき、必要な復元力、可用性、スケーラビリティを 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 として提供されています。これらの SDK を使用すると、Identity Toolkit では不可能な方法でフローを完全にカスタマイズできます。

その他の違いは次のとおりです。

  • セッションと移行

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

始める前に

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

  1. Cloud Console を開き、Identity Toolkit プロジェクトを選択します。

  2. Marketplace で Identity Platform を参照して、[Identity Platform を有効にする] を選択します。

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

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

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

    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 トークンの検証方法を使用するだけで済みます。

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

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

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

    1. Cloud Console でプロジェクトを開きます。
    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 Console で、[プロバイダ] セクションを開きます。

  2. サポートしている連携ログイン プロバイダごとに、次の操作を行います。

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

Android

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

  1. Cloud Console を開き、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 サービス プラグインを含めます。

    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 サービス プラグインを有効にします。

    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.1.2'
    compile 'com.google.android.gms:play-services-auth:20.7.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 Console を開き、Identity Toolkit プロジェクトを選択します。

  3. [プロバイダ] ページで [アプリケーション設定の詳細] をクリックし、[iOS] タブを選択して [Firebase を使ってみる] をクリックします。[Firebase を追加] ダイアログで、アプリのパッケージ名と署名証明書のフィンガープリントを入力し、[アプリを追加] をクリックします。その後、google-services.json 構成ファイルがパソコンにダウンロードされます。[Firebase を追加] ダイアログで、アプリのバンドル ID と App Store ID を入力して、[アプリを追加] をクリックします。その後、GoogleService-Info.plist 構成ファイルがパソコンにダウンロードされます。プロジェクトに複数のバンドル ID がある場合は、Firebase コンソールで各バンドル 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 の呼び出しに置き換えます。