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

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

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

互換性

Chrome は、すべてのパソコン プラットフォームと Android で Signal API をサポートしています。

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

Google パスワード マネージャーは、シグナルを反映するようにパスキーを更新できます。パソコンの Chrome 拡張機能ベースのパスキー プロバイダは、シグナルを反映するかどうかを決定します。

背景

パスキー(検出可能な認証情報)が作成されると、ユーザー名や表示名などのメタデータが秘密鍵とともにパスキー プロバイダ(パスワード マネージャーなど)に保存され、公開鍵認証情報は証明書利用者(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",
      ...
    ]
  });
}

ユーザーがログインした後やアカウント設定を管理した後に PublicKeyCredential.signalAllAcceptedCredentials() を使用します。そのユーザーの有効な認証情報 ID のリストを指定します。パスキー プロバイダは、このリストをそのリライイング パーティのローカル ストレージと比較します。パスキー プロバイダは、ストレージ内で見つかったパスキーのうち、allAcceptedCredentialIds リストに含まれていないものを「非表示」としてマークします。システムでは、これらの非表示のパスキーはログインや自動入力に使用されなくなりますが、すぐに完全に削除されるわけではないため、必要に応じて復元できます。逆に、パスキー プロバイダは、allAcceptedCredentialIds に存在し、「非表示」とマークされているパスキーを復元します。これにより、ウェブサイトで誤って非表示にしたパスキーを復元できます。

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 を使用すると、利用者が既存の認証情報とそのメタデータのリストを通知できるため、パスキー プロバイダのパスキーを同期できます。

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