オリジン トライアル: スムーズなログインのための WebAuthn の即時メディエーション

公開日: 2025 年 8 月 19 日

WebAuthn 即時仲介は、ユーザーのログインフローを効率化するために設計された新しいウェブ機能です。このオリジン トライアルでは、この機能の概要、メリット、実装の詳細について説明します。ぜひご参加いただき、ウェブ認証の未来を形作るお手伝いをいただければ幸いです。

背景

ウェブでの認証は、ユーザーのログインを複雑にするため、摩擦が生じることがよくあります。既存の WebAuthn フローは強力ですが、特に認証情報がすぐに利用できない場合に [ログイン] ボタンで問題が発生し、標準フォームのフォールバックにつながります。

即時メディエーション フローの例

この新機能では、モバイルの preferImmediatelyAvailableCredentials API と同様のスムーズなログインフローが導入されています。ログインの煩わしさを軽減し、ユーザー エクスペリエンスを向上させることで、標準のログイン フォームよりも前にログインを簡素化します。

仕組み

WebAuthn の即時仲介により、より直接的で効率的なログイン エクスペリエンスが可能になります。これにより、ブラウザは、クロスデバイス認証やセキュリティ キー認証を求めることなく、利用可能な認証情報を即座に提供したり、認証情報がないことをすぐに通知したりできるようになります。これにより、デベロッパーの実装が簡素化されます。

immediate メディエーション タイプ

navigator.credentials.get() リクエストに immediate メディエーション タイプを導入します。このオプションを設定すると、ローカルで利用可能な認証情報が見つからない場合、Promise は NotAllowedError で拒否されます。認証情報が存在する場合、ブラウザは認証プロセスを通常どおり処理します。

この柔軟性により、サイトはログインフローを適応させ、すぐに認証情報が利用できない場合に代替手段を適切に提供できます。

重要な点として、ブラウザは引き続き NotAllowedError を返すことで、ユーザーのプライバシーとセキュリティを維持し、フィンガープリントやトラッキングなどの問題を回避できます。

特徴検出

PublicKeyCredential.getClientCapabilities() を使用して、即時メディエーションが利用可能かどうかを検出できます。デベロッパーは、返された capabilities オブジェクトで immediateGet 機能を確認できます。

async function checkImmediateMediationAvailability() {
  try {
    const capabilities = await PublicKeyCredential.getClientCapabilities();
    if (capabilities.immediateGet && window.PasswordCredential) {
      console.log("Immediate Mediation with passwords supported.");
    } else if (capabilities.immediateGet) {
      console.log("Immediate Mediation without passwords supported.");
    } else { console.log("Immediate Mediation unsupported."); }
  } catch (error) {
    console.error("Error getting client capabilities:", error);
  }
}

注: 幅広いブラウザをサポートするため、getClientCapabilities() のポリフィルは WebAuthn Polyfills GitHub リポジトリから入手できます。

実装例

API を使用するには、mediation: 'immediate' を使用して navigator.credentials.get() を呼び出します。ほとんどのユーザーは現在パスワードを保存しているため、このエクスペリエンスをすぐに利用できるように、リクエストに password: true を含めることをおすすめします。

button.addEventListener('click', async (event) => {
  event.preventDefault();
  event.stopPropagation();
  const cred = await navigator.credentials.get({
    password: true,
    publicKey: {
      challenge, // Your server-generated challenge
      rpId: 'example.com' // Your Relying Party ID
    },
    mediation: 'immediate',
  });
});

デベロッパーは、catch ブロックで NotAllowedError を処理して、グレースフル フォールバックのログイン エクスペリエンスを提供する必要があります。

即時メディエーションのステップバイステップ フロー

WebAuthn の即時仲介は、ユーザーのログインを効率化する 2 つの主なユースケースをサポートしています。1 つは、不要なフォールバック オプションを抑制する専用の [パスキーでログイン] ボタンを有効にすること、もう 1 つは、ユーザーの重要な操作の前に認証情報を事前に提供する動的なログインフローを容易にすることです。

ユースケース 1: ログインボタンを使用した明示的なログイン

このシナリオでは、専用のログインボタンを提供することに重点を置いています。これにより、予期しないプロンプトやログインページへの移動を伴うことなく、クリーンなユーザー エクスペリエンスを実現できます。

ユーザーがログインボタンをクリックしたときに、Chrome がすでに保存されている認証情報を提示するフロー。
  1. ユーザーがログインを開始する: ユーザーが [ログイン] ボタンをクリックします。次に、証明書利用者は mediation: "immediate" を使用して navigator.credentials.get() を呼び出します。
  2. 認証情報の選択を求めるブラウザのプロンプト(利用可能な場合): ブラウザは、ローカルで利用可能なパスキーまたはリクエストされたパスワードを確認します。見つかった場合は、ユーザーがアカウントを選択するためのモーダル UI がすぐに表示されます。アカウントは、最後に使用されたタイムスタンプの順に並べ替えられ、次にアルファベット順に並べ替えられます。: 同じアカウントに対して複数のパスワード マネージャーのパスワードとパスキーの両方が見つかった場合、ブラウザはパスキーを優先します。同じアカウントに対して異なるプロバイダのパスキーが複数存在する場合、最後に使用されたパスキーが優先されます。
  3. ログインに成功した場合: ユーザーがブラウザの UI でパスキーを選択します。ブラウザで確認が必要な場合は、以前に設定した方法(PIN、生体認証入力、パターンなど)を使用して本人確認を行うよう求めるメッセージが表示されます。ログインが正常に完了します。
  4. フォールバック パス: パスキーがないか、ユーザーが閉じた場合: サイトで使用できるローカル パスキーまたはリクエストされたパスワードがない場合、またはユーザーがブラウザ UI を閉じた場合、ブラウザは NotAllowedError を証明書利用者(RP)にスローし、ブラウザはクロスデバイス オプションまたはセキュリティ キー オプションの UI を表示しません。その後、証明書利用者は標準のログインページに進むか、代替の認証メカニズムを提供できます。

ユースケース 2: ユーザー アクション前の暗黙的なログインフロー

このシナリオでは、ユーザーが認証状態を必要とするアクション(購入手続きなど)を行う前に、パスキーとパスワードを提供するプロアクティブなログイン エクスペリエンスを実現します。

ログインが必要な操作を行ったときに、Chrome が保存済みの認証情報を提供するフロー。
  1. ユーザーがログインを必要とするアクションを開始する: ユーザーがログインを必要とするアクションのボタン(「購入手続き」ボタンなど)をクリックします。次に、証明書利用者(RP)は mediation: "immediate" を指定して navigator.credentials.get() を呼び出します。
  2. 認証情報の選択を求めるブラウザのプロンプト(利用可能な場合): ブラウザは、ローカルで利用可能なパスキーまたはパスワードを確認します。見つかった場合は、ユーザーがアカウントを選択するためのモーダル UI がすぐに表示されます。アカウントは、最後に使用したタイムスタンプでランク付けされ、アルファベット順に並べ替えられ、重複が削除されて、アカウントごとに 1 つのエントリが表示されます。: 同じアカウントに対して複数のパスワード マネージャーのパスワードとパスキーの両方が見つかった場合、ブラウザはパスキーを優先します。同じアカウントのパスキーが複数のプロバイダから存在する場合、最後に使用されたパスキーが優先されます。

  3. ログイン成功: ユーザーがブラウザ UI から認証情報を選択します。ブラウザで確認が必要な場合は、以前に設定した方法(PIN、生体認証入力、パターンなど)を使用して本人確認を行うよう求めるメッセージが表示されます。ログインが正常に完了します。

  4. フォールバック パス: 認証情報がないか、ユーザーが閉じた場合: サイトのローカル認証情報がない場合、またはユーザーがブラウザの UI を閉じた場合、ブラウザは NotAllowedError を証明書利用者にスローし、ブラウザは UI を表示しません。ユーザーのログイン エクスペリエンスは、本日より変更されません。その後、信頼できるパーティはユーザーに詳細情報(メールアドレスなど)を尋ねたり、パスワード フォーム、SMS 認証、クロスデバイス認証システムをサポートする WebAuthn モーダル リクエストなどの代替認証メカニズムを表示したりできます。

利点

WebAuthn の即時仲介には、デベロッパーとユーザーにとっていくつかの重要なメリットがあります。

  • スムーズなログイン: ブラウザやパスワード マネージャーに保存されているパスキーやパスワードをすぐに利用できるユーザーに対して、よりスムーズで負担の少ないログイン エクスペリエンスを提供します。
  • インテリジェント ログイン: ユーザーがログインを必要とするアクティビティを実行しようとしたときに、API がログイン フローを有効にします。これらは、ユーザーの認証情報のステータスに合わせてインテリジェントに調整されます。可能な場合はすぐに認証を行い、不要なリダイレクトを回避してフローを効率化します。
  • 認証情報の管理の改善: 複数のパスワード マネージャーが同じアカウントの認証情報を提供している場合、ブラウザが最も適切なオプションをインテリジェントに選択し、ユーザーの認証情報管理を簡素化します。
  • ユーザーの混乱を軽減: 既知の認証情報を直接提示することで、複数のログイン オプションや標準フォームでよく発生するユーザーの混乱を最小限に抑えます。
  • シームレスなフォールバック: 認証情報をすぐに利用できないユーザーに対して、標準のログインページへのシームレスなフォールバックを保証します。つまり、ユーザー エクスペリエンスは現在のフローから変更されません。

プライバシーとセキュリティ

WebAuthn の即時仲介により、ユーザーがログイン試行を明示的に承認する前に、サイトがすぐに利用可能な認証情報の存在を特定できます。ユーザーのプライバシーを保護し、不正使用を防止するため、Google はいくつかの重要な対策を実施しています。

  • ユーザー操作の要件: API 呼び出しにはユーザー操作(一時的なユーザーの有効化)が必要です。これにより、サイトによるサイレント プロービングとフィンガープリンティングが困難になります。
  • シークレット セッションとプライベート セッション: シークレット セッションまたはプライベート セッションでは、即時メディエーション リクエストは NotAllowedError をスローします。
  • allowCredentials リストの制限: allowCredentials リストを使用するリクエストは NotAllowedError をスローします。これにより、サイトがユーザーの操作履歴を推測したり、セッションをまたいでユーザーをトラッキングしたりすることを防ぐことができます。
  • キャンセル: メディエーションをすぐに開始するリクエストで signal パラメータを設定することは無効です。これにより、サイトがブラウザ UI をプログラムで閉じることができなくなります。

試してみる

WebAuthn の即時仲介を試してみることをおすすめします。

Chrome のステータス

この機能は、Chromium の開発サイクルに沿って進められています。

  • パソコン: Chrome 136 でデベロッパー試用版、Chrome 139 ~ 141 でオリジン トライアル。
  • Android: Chrome 140 でデベロッパー トライアルを実施。

ローカルテストの場合

WebAuthn 即時メディエーションをローカルでテストするには:

  1. Chrome 139 をダウンロードする: パソコンで Chrome の最新バージョンを入手して開きます。
  2. Immediate Mediation フラグを有効にする: アドレスバーで chrome://flags/#web-authentication-immediate-get に移動し、「Web Authentication Immediate Get」フラグを有効にします。
  3. 認証情報を準備する: 使用可能なパスキーとパスワードが保存されていることを確認します。
    • Google パスワード マネージャーに保存されているパスワード。
    • Google パスワード マネージャー(ログインして Chrome を Google アカウントと同期する必要がある)、Windows Hello、または iCloud キーチェーンに保存されているパスキー。

公開テスト(オリジン トライアル)の場合

一般公開環境でオリジン トライアルを使用して WebAuthn の即時メディエーションをテストするには:

  1. 登録: Chrome オリジン トライアルのページにアクセスし、「WebAuthn immediate mediation」トライアルに登録します。
  2. HTTP ヘッダーにトークンを追加する: 提供されたオリジン トライアル トークンをサイトの HTTP ヘッダーに含めます。 HTML Origin-Trial: [YOUR_TRIAL_TOKEN]

注: JavaScript を使用してプログラムでトークンを指定することもできます。

テストシナリオ

リファレンス実装を提供しています。さまざまなシナリオをテストするために、独自のプロトタイプを構築することをおすすめします。

  • リファレンス デモ: https://deephand.github.io/webauthn-immediate-demo/ でリファレンス実装を試すことができます。
    • プロトタイプを実装する: サイトにプロトタイプを実装する際は、ユーザーがクリックした後([ログイン] ボタンや、ユーザーのログインが必要な操作など)に mediation: 'immediate' を使用して navigator.credentials.get() 呼び出しを行うようにしてください。
  • フロー 1: パスワードまたはパスキーなしでログインする: サイトで使用できるパスキーやパスワードがない場合、[ログイン] をクリックすると、ブラウザの UI が表示されることなく、標準のログインページに直接移動します。
  • フロー 2: すぐに利用可能なローカル パスキーでログインする: サイトに保存されているパスキーがある場合、[ログイン] をクリックすると、即時メディエーション UI がトリガーされ、パスキーを選択できるようになります。
  • フロー 3: ローカル パスキーまたはパスワードでログインする: パスキーとパスワードの両方が保存されている場合は、(コードで password: true を設定して)[パスワードをリクエスト] オプションを有効にします。[ログイン] をクリックすると、Immediate Mediation UI にパスキーとパスワードの両方のオプションが表示されます。