公開日: 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 つの方法があります。
PublicKeyCredential.signalUnknownCredential
: 認証情報が存在しないことを示すシグナルPublicKeyCredential.signalAllAcceptedCredentials
: 保存された認証情報のリストを通知しますPublicKeyCredential.signalCurrentUserDetails
: 更新されたユーザー名または表示名を通知
認証情報が存在しないことを通知する
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()
を呼び出すことで、指定された認証情報が削除されたか存在しないことをパスキー プロバイダに通知できます。このシグナルの処理方法はパスキー プロバイダに委ねられますが、関連付けられた認証情報が存在しないため、ユーザーがパスキーでログインできないように、関連付けられたパスキーが削除されることが想定されます。
この API は、認証情報がないためにパスキーベースのログインが失敗した場合に呼び出すことができます。これにより、RP は、関連付けられた認証情報のないパスキーでユーザーがログインしようとするのを防ぐことができます。signalAllAcceptedCredentials
とは異なり、この方法では認証情報 ID のリスト全体を渡す必要がないため、特定のユーザーのパスキーの数を明らかにしないように、ユーザーが認証されていない場合は常に使用する必要があります。

保存された認証情報のリストを通知する
// 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 はストレージに残っている認証情報をパスキー プロバイダに通知できます。このシグナルの処理方法はパスキー プロバイダに委ねられますが、このリストに一致しないパスキーは削除され、関連付けられた認証情報が存在しないパスキーがログイン時にユーザーに表示されないようにすることが想定されています。
この 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()
を呼び出すことで、更新されたユーザー情報をパスキー プロバイダに通知できます。このシグナルの処理方法はパスキー プロバイダに委ねられますが、ユーザーが所有するパスキーは新しいユーザー情報で更新されることが想定されます。
この API は、ユーザーのユーザー名または表示名が更新されたとき、およびログインするたびに呼び出すことができます。これにより、パスキー プロバイダはこの情報をサーバーと同期させることができます。

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