Signal API を使用して、パスキーとサーバー上の認証情報の整合性を保つ

公開日: 2024 年 11 月 12 日、最終更新日: 2024 年 11 月 29 日

WebAuthn Signal API を使用すると、利用者が、接続されたパスキー プロバイダに既存の認証情報を通知できるようになります。これにより、対応するパスキー プロバイダは、ストレージ内の誤ったパスキーや取り消されたパスキーを更新または削除し、ユーザーに提供されないようにすることが可能です。

互換性

パソコン版 Chrome では、Chrome 132 以降で Signal API がサポートされています。Google パスワード マネージャーは、シグナルを反映してパスキーを更新できます。Chrome 拡張機能ベースのパスキー プロバイダの場合、シグナルを反映するかどうかはプロバイダ次第です。

Android 版 Chrome のサポートは後日提供予定です。

Safari はサポートしていますが、まだ実装されていません。Firefox はまだ意見を共有していません

背景

パスキー(検出可能な認証情報)が作成されると、ユーザー名や表示名などのメタデータが秘密鍵とともにパスキー プロバイダ(パスワード マネージャーなど)に保存され、公開鍵認証情報は証明書利用者(RP)のサーバーに保存されます。ユーザー名と表示名を保存すると、プロンプトが表示されたときに、どのパスキーでログインするかをユーザーが識別しやすくなります。これは、異なるパスキー プロバイダのパスキーが 2 つ以上ある場合に特に便利です。

ただし、パスキー プロバイダのパスキー リストとサーバーの認証情報リストの間に不整合があると、混乱を招く可能性があります。

1 つ目のケースは、ユーザーがサーバー上の認証情報を削除し、パスキー プロバイダのパスキーはそのまま残す場合です。次回ユーザーがパスキーでログインしようとすると、そのパスキーはパスキー プロバイダによってユーザーに提示されます。ただし、削除された公開鍵でサーバーが検証できないため、ログインは失敗します。

2 つ目のケースは、ユーザーがサーバーでユーザー名または表示名を更新した場合です。ユーザーが次回ログインしようとすると、サーバーで更新されているにもかかわらず、パスキー プロバイダのパスキーに古いユーザー名と表示名が表示されます。理想的には同期している必要があります。

Signal API

Signal API は、RP がパスキー プロバイダに変更を通知できるようにすることで、こうした混乱を解消する WebAuthn API です。次の 3 つの方法があります。

認証情報が存在しないことを通知する

const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();

const result = await fetch('/login', { ... });

// Detect authentication failure due to lack of the credential
if (result.status === 404) {
  // Feature detection
  if (PublicKeyCredential.signalUnknownCredential) {
    await PublicKeyCredential.signalUnknownCredential({
      rpId: "example.com",
      credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
    });
  } else {
    // Encourage the user to delete the passkey from the password manager nevertheless.
    ...
  }
}

RP は、RP ID と認証情報 ID を指定して PublicKeyCredential.signalUnknownCredential() を呼び出すことで、指定された認証情報が削除されたか存在しないことをパスキー プロバイダに通知できます。このシグナルの処理方法はパスキー プロバイダに委ねられますが、関連付けられた認証情報が存在しないため、ユーザーがパスキーでログインできないように、関連付けられたパスキーが削除されることが想定されます。

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

この API は、認証情報がないためにパスキーベースのログインが失敗した場合に呼び出すことができます。これにより、RP は、関連付けられた認証情報のないパスキーでユーザーがログインしようとするのを防ぐことができます。signalAllAcceptedCredentials とは異なり、この方法では認証情報 ID のリスト全体を渡す必要がないため、特定のユーザーのパスキーの数を明らかにしないように、ユーザーが認証されていない場合は常に使用する必要があります。

Chrome の Google パスワード マネージャーからパスキーを削除したときに表示されるダイアログ。
Chrome の Google パスワード マネージャーからパスキーが削除されたときに表示されるダイアログ。

保存された認証情報のリストを通知する

// After a user deletes a passkey or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      ...
    ]
  });
}

RP ID、ユーザー ID、保存された認証情報の認証情報 ID のリストを指定して PublicKeyCredential.signalAllAcceptedCredentials() を呼び出すことで、RP はストレージに残っている認証情報をパスキー プロバイダに通知できます。このシグナルの処理方法はパスキー プロバイダに委ねられますが、このリストに一致しないパスキーは削除され、関連付けられた認証情報が存在しないパスキーがログイン時にユーザーに表示されないようにすることが想定されています。

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

この API は、RP でユーザーがパスキーを削除したときすべてのログイン時に呼び出す必要があります。これにより、パスキー プロバイダはパスキーの同期リストを維持できます。

Signal でユーザー名と表示名が更新された

// After a user updated their username and/or display name
// or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
  await PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    name: "a.new.email.address@example.com", // username
    displayName: "J. Doe"
  });
} else {
}

RP は、RP ID、ユーザー ID、ユーザー名、表示名を使用して PublicKeyCredential.signalCurrentUserDetails() を呼び出すことで、更新されたユーザー情報をパスキー プロバイダに通知できます。このシグナルの処理方法はパスキー プロバイダに委ねられますが、ユーザーが所有するパスキーは新しいユーザー情報で更新されることが想定されます。

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

この API は、ユーザーのユーザー名または表示名が更新されたとき、およびログインするたびに呼び出すことができます。これにより、パスキー プロバイダはこの情報をサーバーと同期させることができます。

Chrome の Google パスワード マネージャーでパスキーのメタデータが更新されたときに表示されるダイアログ。
Chrome の Google パスワード マネージャーでパスキー メタデータが更新されたときに表示されるダイアログ。

概要

Signal API を使用すると、予期しないログイン失敗の可能性を排除し、より優れたパスキー エクスペリエンスを構築できます。Signal API を使用すると、利用者は既存の認証情報とそのメタデータのリストを通知して、パスキー プロバイダのパスキーを同期できます。

パスキーについて詳しくは、パスキーによるパスワードなしのログインをご覧ください。