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

Chrome 122 以降では、Federated Credential Management API(FedCM)用の Disconnect API を使用できます。Disconnect API を使用すると、リライング パーティはサードパーティ Cookie に依存せずに、ID プロバイダのアカウントからユーザーを接続解除できます。また、FedCM の同一サイト処理が 2 ~ 3 点更新されています。

切断 API

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

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

切断 API を使用すると、ユーザーはブラウザと IdP サーバーの RP から 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 を返します。この Promise は、次の理由で例外をスローする場合があります。

  • ユーザーが FedCM を通じて IdP を使用して RP にログインしていない。
  • FedCM 権限ポリシーのない iframe から API が呼び出されている。
  • 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 は well-known ファイルのチェックをスキップします。これにより、デベロッパーはこのようなシナリオでテストできます。

サブリソースで同一サイトのログイン ステータスを設定できるようになりました

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

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

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

まとめ

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

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