FedCM の更新: Disconnect API と 2 つの更新

Chrome 122 以降、Federated Credential Management API(FedCM)Disconnect API が利用可能になりました。Disconnect API を使用すると、リライング パーティはサードパーティ Cookie に依存することなく、ID プロバイダのアカウントからユーザーを接続解除できます。また、FedCM の同一サイト処理にもいくつかの変更が加えられています。

Disconnect API

ユーザーが ID 連携を介してリライング パーティ(RP(認証に ID プロバイダを使用するサイト))にアカウントを作成すると、通常、ID プロバイダ(IdP(認証とアカウント情報を第三者に提供するサービス))がサーバーに接続を記録します。保存された接続により、IdP はユーザーがログインしている RP を追跡し、エクスペリエンスを最適化できます。たとえば、ユーザーが後で RP に戻ったときに優れたエクスペリエンスを提供するために、IdP を使用するユーザー アカウントはリピーター アカウントとして扱われます。これにより、自動再認証や、使用したアカウントを示すパーソナライズされたボタンなどの機能を利用できます。

IdP が、アカウントと RP の接続を解除する API を提供している場合があります。ただし、切断フローは認証され、IdP クッキーが必要です。サードパーティ Cookie のない世界では、ユーザーが RP にアクセスしたときに、RP が IdP との接続を切断するためのブラウザ API はありません。特定の RP にリンクされている同じ IdP の複数の IdP アカウントが存在する可能性があるため、接続解除フローでは、どのアカウントが切断されているのかを把握する必要があります。

Disconnect API を使用すると、ユーザーは指定したエンドポイントにシグナルを送信することで、ブラウザ上の RP と IdP サーバー上の IdP アカウントの接続を解除できます。ユーザーは、Federated Credential Management API(FedCM)を使用した ID 連携を完了している必要があります。ユーザーの接続が解除されると、次回 IdP を使用して RP にログインしようとしたユーザーは、新規ユーザーとして扱われます。

IdP と RP の接続を解除する

ユーザーが FedCM を介して IdP を使用して RP にログインしたことがある場合、その関係は、接続されたアカウントのリストとしてローカルでブラウザに記憶されます。RP は、IdentityCredential.disconnect() 関数を呼び出して切断を開始する場合があります。この関数は、トップレベル RP フレームから呼び出すことができます。RP は、configURL、IdP で使用する clientId、IdP の接続を切断するための accountHint を渡す必要があります。アカウント ヒントは、切断エンドポイントがアカウントを識別できる限り任意の文字列にできます。たとえば、メールアドレスやユーザー ID は、アカウント リストのエンドポイントから提供されたアカウント ID と必ずしも一致しません。

// Disconnect an IdP account "account456" from the RP "https://idp.com/". This is invoked on the RP domain.
IdentityCredential.disconnect({
  configURL: "https://idp.com/config.json",
  clientId: "rp123",
  accountHint: "account456"
});

IdentityCredential.disconnect()Promise を返します。このプロミスは、次の理由で例外をスローすることがあります。

  • ユーザーが FedCM 経由で IdP を使用して RP にログインしていない。
  • API は、FedCM 権限ポリシーのない iframe 内から呼び出されます。
  • configURL が無効であるか、切断エンドポイントがありません。
  • コンテンツ セキュリティ ポリシー(CSP)チェックが失敗します。
  • 保留中の接続解除リクエストがあります。
  • ユーザーがブラウザの設定で FedCM を無効にしている。

IdP の切断エンドポイントがレスポンスを返すと、ブラウザで RP と IdP の接続が切断され、Promise が解決されます。切断するユーザー アカウントは、切断エンドポイントからのレスポンスで指定されます。

IdP 構成ファイルの設定

Disconnect API をサポートするには、IdP が切断エンドポイントをサポートし、IdP 構成ファイルdisconnect_endpoint プロパティとそのパスを指定する必要があります。

{
  "accounts_endpoint": "/accounts",
  "id_assertion_endpoint": "/assertion",
  ...
  "disconnect_endpoint: "/disconnect"
}

切断エンドポイントでアカウントの接続を解除する

IdentityCredential.disconnect() を呼び出すと、ブラウザは Cookie とコンテンツ タイプ application/x-www-form-urlencoded を含むクロスオリジン POST リクエストを、次の情報を含めてこの切断エンドポイントに送信します。

プロパティ 説明
account_hint IdP アカウントのヒント。
client_id RP のクライアント ID。
POST /disconnect HTTP/1.1
Host: idp.example
Origin: rp.example
Content-Type: application/x-www-form-urlencoded
Cookie: 0x123
Sec-Fetch-Dest: webidentity

account_hint=account456&client_id=rp123

リクエストを受信すると、IdP サーバーは次の処理を行う必要があります。

  1. CORS(クロスオリジン リソース シェアリング)を使用してリクエストに応答します。
  2. リクエストに Sec-Fetch-Dest: webidentity HTTP ヘッダーが含まれていることを確認します。
  3. Origin ヘッダーを client_id によって決定される RP オリジンと照合します。一致しない場合は拒否します。
  4. account_hint に一致するアカウントを見つけます。
  5. RP の接続済みアカウントのリストからユーザー アカウントを接続解除します。
  6. 識別されたユーザーの account_id を JSON 形式でブラウザに返します。

レスポンスの JSON ペイロードの例を次に示します。

{
  "account_id": "account456"
}

IdP がブラウザで RP に関連付けられているすべてのアカウントの接続を切断することを希望する場合は、アカウント ID と一致しない文字列("*" など)を渡します。

RP と IdP が同じサイトである場合、/.well-known/web-identity の確認がスキップされるようになりました

FedCM システムを開発する場合、テストまたはステージング RP サーバー ドメインは、本番環境の IdP サーバーのサブドメインである場合があります。たとえば、本番環境の IdP サーバーは idp.example にあり、ステージング RP サーバーとステージング IdP サーバーの両方が staging.idp.example にあります。ただし、well-known ファイルは IdP サーバーの eTLD+1 のルートに配置する必要があるため、本番環境サーバーである idp.example/.well-known/web-identity に配置する必要があります。デベロッパーが開発中に本番環境にファイルを配置できるとは限らないため、FedCM をテストできません。

Chrome 122 以降、RP ドメインと IdP ドメインが同じ場合、Chrome は既知のファイルのチェックをスキップします。これにより、デベロッパーはこのようなシナリオでテストできるようになります。

サブリソースで同じサイトのログイン ステータスを設定可能に

これまで Chrome では、ログイン ステータスの設定(Set-Login: logged-in ヘッダーの使用など)は、リクエストが 同一オリジン すべての祖先である場合のみ可能でした。これにより、ログイン ステータスを設定する同一サイト fetch() リクエストによるログインを防ぐことができました。

たとえば、ユーザーが idp.example にユーザー名とパスワードを入力できるウェブサイトがあるとします。この場合、認証情報は fetch() とともに login.idp.example に投稿されます。2 つのドメインがクロスオリジンかつ同一サイトであるため、Login Status API を使用してブラウザにログイン ステータスを記録できませんでした。

この変更により、Login Status API がすべての祖先と同じサイトであるという要件が緩和され、上記の例で HTTP ヘッダー(Set-Login: logged-in)を使用して login.idp.example のログイン ステータスを設定できるようになりました。

概要

Disconnect API を使用すると、FedCM はサードパーティ Cookie に依存せずに IdP から RP を切断できます。これを行うには、RP で IdentityCredential.disconnect() を呼び出します。この関数を使用すると、ブラウザは IdP の切断エンドポイントにリクエストを送信し、IdP がサーバーで接続を終了してから、ブラウザで接続を終了できるようにします。

テスト目的で、RP と IdP が同じサイトの場合、/.well-known/web-identity チェックがスキップされることを発表しました。また、同じサイト IdP サブリソースからの HTTP レスポンス ヘッダーを使用してログイン ステータスを設定できるようになりました。