FedCM の更新: Button Mode API オリジン トライアル、CORS、SameSite

Chrome 125 以降、ボタンモード API のオリジン トライアルがパソコンで開始されます。ボタンモード API を使用すると、ユーザーが API 呼び出し時にアクティブな IdP セッションを持っていない場合でも、ID プロバイダは FedCM API を使用できます。ユーザーは IdP サイトに移動することなく、フェデレーション アカウントでウェブサイトにログインできます。ボタンモードの FedCM UI は、ユーザーの操作によってゲートされるため、既存のウィジェット フローの UI よりも目立ち、ログインに対するユーザーの意図をより適切に反映します。

Button Mode API

FedCM ユーザー インターフェースは、API が呼び出されるとすぐに、パソコンでは右上隅に表示されるウィジェットとして、モバイルではボトムシートとして利用可能になりました。API は、ユーザーが証明書利用者(RP)にアクセスしたときに呼び出される可能性があります。これを「ウィジェット モード」と呼びます。ウィジェットを表示するには、ユーザーが RP にアクセスする前に IdP にログインしている必要があります。FedCM 自体には、ユーザーが IdP で利用可能なアカウントを使用して RP にログインする前に、ユーザーが IdP にログインできるようにする信頼性の高い方法がありませんでした。FedCM では、このための方法が追加されようとしています。

ウィジェット モードでは、ユーザーが有効にしなくても、デスクトップ版 Chrome の右上隅にダイアログが表示されます。
ウィジェット モードでは、ユーザーが操作しなくても、パソコン版 Chrome の右上隅にダイアログが表示されます。

新しい Button Mode API は、button モードという新しい UI モードを追加します。ウィジェット モードとは異なり、ボタン モードはユーザーが RP にアクセスした直後に呼び出されるものではありません。このメソッドは、ユーザーが [IdP でログイン] ボタンを押すなどしてログインフローを開始したときに呼び出すことを想定しています。

ボタンが押されるとすぐに、FedCM は アカウント エンドポイントへのフェッチまたはブラウザに保存されたログイン ステータスを通じて、ユーザーが IdP にログインしているかどうかを確認します。ユーザーがまだログインしていない場合、FedCM は、ポップアップ ウィンドウを介して IdP から提供された login_url を使用して IdP にログインするようユーザーに求めます。ブラウザがユーザーがすでに IdP にログインしていることを認識している場合、またはユーザーがポップアップ ウィンドウで IdP にログインするとすぐに、FedCM はユーザーがログインに使用する IdP アカウントを選択するためのモーダル ダイアログを開きます。アカウントを選択すると、ユーザーは IdP アカウントを使用して RP にログインできます。

ボタンモードの UI では、表示されるログイン ダイアログがウィジェット モードよりも大きいため、視覚的な一貫性を保つために、ブランディング アイコンも大きくする必要があります。ウィジェット モードのアイコンの最小サイズは 25x25 ピクセルですが、ボタン モードのアイコンの最小サイズは 40x40 ピクセルです。IdP の既知のファイルでは、次のように複数のアイコン URL を指定できます。

{
  // ... Other settings (like endpoints) here
  "branding": {
    "icons": [
      {
        "url": "https://size-25px-image",
        "size": 25,
      },
      {
        "url": "https://size-40px-image",
        "size": 40
      }
    ]
  }
}
ボタンモードでは、パソコン版 Chrome の中央上部にモーダル ダイアログが表示されます。
ボタンモードでは、パソコン版 Chrome の上部中央にモーダル ダイアログが表示され、アイコンが大きくなります。

Chrome 125 を使用して、https://fedcm-demo-rp.dev/active-mode でお試しください。

ユーザーがボタンモード API を使用して RP にログインしています。

Button Mode API を使用するには:

  • chrome://flags で試験運用版機能 FedCmButtonMode を有効にします。
  • ボタンのクリックなど、一時的なユーザー アクティベーションの背後で API を呼び出すようにしてください。
  • 次のように mode パラメータを使用して API を呼び出します。
  return await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: "https://idp.example/config.json",
        clientId: "123",
        nonce:"456",
      }],
      mode: "button"
    }
  });

ブラウザは、mode=button を含めることでリクエスト タイプを表す新しいパラメータを ID アサーション エンドポイントに送信します。

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity
account_id=123&client_id=client1234&nonce=Ct60bD&disclosure_text_shown=true&is_auto_selected=false&mode=button

特徴検出

ブラウザがボタンモードを使用できるかどうかを判断するには、次のコードで確認します。

let supportsFedCmMode = false;
try {
  navigator.credentials.get({
    identity: Object.defineProperty(
      {}, 'mode', {
        get: function () { supportsFedCmMode = true; }
      }
    )
  });
} catch(e) {}

if (supportsFedCmMode) {
  // The button mode is supported.
}

別のアカウント オプションを使用する

たとえば、IdP が複数のアカウントをサポートしている場合や、既存のアカウントを置き換える場合、RP はアカウント選択ツールでユーザーが「他のアカウントを使用」できるようにすることができます。

別のアカウントを使用するオプションを有効にするには:

  • chrome://flags で試験運用版機能 FedCmUseOtherAccount を有効にするか、Button Mode API のオリジン トライアルに登録します。
  • IdP は、IdP 構成ファイルで次の項目を指定します。
{
  "accounts_endpoint" : ...,
  "modes: {
    "button": {
      "supports_use_other_account": true,
    }
  }
}

オリジン トライアルに参加する

Chrome 125 以降で Chrome フラグ chrome://flags#fedcm-button-mode をオンにすると、ボタンモード API をローカルで試すことができます。

IdP は、オリジン トライアルを登録してボタンモードを有効にすることもできます。

オリジン トライアルでは、新機能を試して、そのユーザビリティ、実用性、有効性に関するフィードバックをウェブ標準コミュニティに送信できます。詳しくは、ウェブ デベロッパー向けのオリジン トライアル ガイドをご覧ください。

Button Mode API のオリジン トライアルは、Chrome 125 から Chrome 130 までご利用いただけます。

  1. オリジン トライアルの登録ページに移動します。
  2. [登録] ボタンをクリックし、フォームに記入してトークンをリクエストします。
  3. IdP のオリジンを [Web Origin] として入力します。
  4. [サードパーティのマッチング] をオンにして、他のオリジンで JavaScript を使用してトークンを挿入します。
  5. [送信] をクリックします。
  6. 発行されたトークンをサードパーティのウェブサイトに埋め込みます。

サードパーティのウェブサイトにトークンを埋め込むには、IdP のオリジンから提供される IdP の JavaScript ライブラリまたは SDK に次のコードを追加します。

const tokenElement = document.createElement('meta');
tokenElement.httpEquiv = 'origin-trial';
tokenElement.content = 'TOKEN_GOES_HERE';
document.head.appendChild(tokenElement);

TOKEN_GOES_HERE は、独自のトークンに置き換えます。

Chrome 125 で CORS と SameSite=None が必須に

CORS

Chrome 125 以降、ID アサーション エンドポイントCORS が適用されます。

CORS(クロスオリジン リソース シェアリング)は、HTTP ヘッダーの送信で構成されるシステムです。このシステムは、ブラウザがフロントエンドの JavaScript コードによるクロスオリジン リクエストのレスポンスへのアクセスをブロックするかどうかを決定します。IdP サーバーの ID アサーション エンドポイントは、追加のヘッダーを使用してリクエストに応答する必要があります。次に、https://fedcm-rp-demo.glitch.me からのリクエストに対するレスポンス ヘッダーの例を示します。

Access-Control-Allow-Origin: https://fedcm-rp-demo.glitch.me
Access-Control-Allow-Credentials: true

SameSite=None

Cookie の SameSite パラメータは、Cookie がファーストパーティまたは同一サイトのコンテキストに制限されるかどうかを宣言します。None に指定すると、Cookie をサードパーティ ドメインに送信できます。

FedCM では、Chrome は アカウント エンドポイントID アサーション エンドポイント切断エンドポイントに Cookie を送信します。Chrome 125 以降では、Chrome は SameSite=None と明示的にマークされた Cookie のみを含む認証情報付きリクエストを送信します。