検出可能な認証情報の詳細

パスキーなどの FIDO の認証情報はパスワードを置き換えるためのものですが、そのほとんどはユーザーがユーザー名を入力する手間を省くこともできます。これにより、ユーザーは現在のウェブサイトのパスキーのリストからアカウントを選択して認証できるようになります。

以前のバージョンのセキュリティ キーは 2 段階認証方式として設計されており、潜在的な認証情報の ID が必要だったため、ユーザー名を入力する必要がありました。セキュリティ キーが ID を知らなくても検出できる認証情報を検出可能な認証情報と呼びます。今日作成された FIDO クレデンシャルのほとんどは、見つけやすいクレデンシャルである。パスワード マネージャーや最新のセキュリティ キーに保存されているパスキーは特にそうです。

認証情報がパスキー(検出可能な認証情報)として作成されるようにするには、認証情報の作成時に residentKeyrequireResidentKey を指定します。

信頼できる当事者(RP)は、パスキー認証中に allowCredentials を省略することで、検出可能な認証情報を使用できます。このような場合 ブラウザまたはシステムで、利用可能なパスキーのリストがユーザーに表示されます。このリストは、 作成時に設定される user.name プロパティ。ユーザーがいずれかを選択すると、user.id 生成されたシグネチャに含まれます。サーバーは、入力されたユーザー名ではなく、その ID または返された認証情報 ID を使用してアカウントを検索できます。

前述のようなアカウント選択の UI に検出不可が表示されることはない 認証情報を取得できます。

requireResidentKeyresidentKey

パスキーを作成するには、navigator.credentials.create()authenticatorSelection.residentKeyauthenticatorSelection.requireResidentKey を指定し、次のように値を指定します。

<ph type="x-smartling-placeholder">
async function register () {
  // ...

  const publicKeyCredentialCreationOptions = {
    // ...
    authenticatorSelection: {
      authenticatorAttachment: 'platform',
      residentKey: 'required',
      requireResidentKey: true,
    }
  };

  const credential = await navigator.credentials.create({
    publicKey: publicKeyCredentialCreationOptions
  });

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;

  // ...
}

residentKey:

  • 'required': 検出可能な認証情報を作成する必要があります。作成できない場合は、NotSupportedError が返されます。
  • 'preferred': RP は検出可能な認証情報の作成を優先しますが、検出不可能な認証情報も受け入れます。
  • 'discouraged': RP は検出不可能な認証情報の作成を優先しますが、検出可能な認証情報を受け入れます。

requireResidentKey:

  • このプロパティは、古いバージョンの仕様である WebAuthn Level 1 との下位互換性を確保するために保持されています。residentKey'required' の場合は true に設定し、それ以外の場合は false に設定します。

allowCredentials

RP は navigator.credentials.get()allowCredentials を使用して、パスキー認証エクスペリエンスを制御できます。通常、パスキーの認証エクスペリエンスは 3 種類あります。

検出可能な認証情報を使用すると、RP はモーダル アカウント選択ツールを表示して、ユーザーがログインするアカウントを選択した後、ユーザー確認を行うことができます。これは、パスキー認証専用のボタンを押して開始するパスキー認証フローに適しています。

このユーザー エクスペリエンスを実現するために、navigator.credentials.get()allowCredentials パラメータを省略するか、空の配列を渡します。

async function authenticate() {
  // ...

  const publicKeyCredentialRequestOptions = {
    // Server generated challenge:
    challenge: ****,
    // The same RP ID as used during registration:
    rpId: 'example.com',
    // You can omit `allowCredentials` as well:
    allowCredentials: []
  };

  const credential = await navigator.credentials.get({
    publicKey: publicKeyCredentialRequestOptions,
    signal: abortController.signal
  });

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;
  
  // ...
}

パスキーのフォーム自動入力を表示する

上記のモーダル アカウント選択ツールは、ほとんどのユーザーがパスキーを使用していて、ローカル デバイスでパスキーを使用できる場合に適しています。ローカルのパスキーがないユーザーには、引き続きモーダル ダイアログが表示され、別のデバイスのパスキーを提示するよう求めるメッセージが表示されます。ユーザーをパスキーに移行している間は、パスキーを設定していないユーザーに対して UI を表示しないようにすることをおすすめします。

代わりに、パスキーの選択内容を、従来のログイン フォームのフィールドに自動入力するプロンプトに、保存されているユーザー名とパスワードとともに組み込むことができます。これにより、パスキーを持つユーザーはログイン フォームでパスキーを選択すると、ユーザー名とパスワードのペアが保存されているユーザーがそれらのペアを選択でき、どちらもユーザー名とパスワードを入力できなくなります。

このユーザー エクスペリエンスは、パスワードとパスキーが混在する移行中の RP に最適です。

このようなユーザー エクスペリエンスを実現するには、allowCredentials プロパティに空の配列を渡すか、パラメータを省略するだけでなく、navigator.credentials.get()mediation: 'conditional' を指定し、HTML username 入力フィールドに autocomplete="username webauthn" アノテーションを付けるか、password 入力フィールドに autocomplete="password webauthn" アノテーションを付けます。

navigator.credentials.get() を呼び出しても UI は表示されませんが、ユーザーがアノテーション付きの入力フィールドにフォーカスすると、利用可能なパスキーが自動入力オプションに含まれます。いずれかを選択すると、ユーザーは通常のデバイスのロック解除確認が行われ、その後で .get() から返された Promise が結果で解決されます。ユーザーがパスキーを選択しない場合、Promise は解決しません。

async function authenticate() {
  // ...

  const publicKeyCredentialRequestOptions = {
    // Server generated challenge:
    challenge: ****,
    // The same RP ID as used during registration:
    rpId: 'example.com',
    // You can omit `allowCredentials` as well:
    allowCredentials: []
  };

  const cred = await navigator.credentials.get({
    publicKey: publicKeyCredentialRequestOptions,
    signal: abortController.signal,
    // Specify 'conditional' to activate conditional UI
    mediation: 'conditional'
  });

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;
  
  // ...
}
<input type="text" name="username" autocomplete="username webauthn" ...>

このユーザー エクスペリエンスを構築する方法については、フォームの自動入力でパスキーを使用してログインすると、Codelab のウェブアプリでフォームの自動入力を使用してパスキーを実装するをご覧ください。

再認証

再認証にパスキーを使用する場合など、ユーザーの識別子はすでにわかっていることがあります。この例では、ブラウザや OS にアカウント選択画面が表示されない状態でパスキーを使用します。これを行うには、allowCredentials パラメータで認証情報 ID のリストを渡します。

この場合、指定した認証情報のいずれかがローカルで使用できる場合、ユーザーはすぐにデバイスのロック解除を求められます。有効になっていない場合は、有効な認証情報が保存されている別のデバイス(スマートフォンまたはセキュリティ キー)を提示するよう求めるメッセージが表示されます。

このユーザー エクスペリエンスを実現するために、ログインするユーザーの認証情報 ID のリストを提供します。ユーザーはすでに既知であるため、RP はクエリを実行できます。認証情報 ID を navigator.credentials.get()allowCredentials プロパティに PublicKeyCredentialDescriptor オブジェクトとして指定します。

async function authenticate() {
  // ...

  const publicKeyCredentialRequestOptions = {
    // Server generated challenge:
    challenge: ****,
    // The same RP ID as used during registration:
    rpId: 'example.com',
    // Provide a list of PublicKeyCredentialDescriptors:
    allowCredentials: [{
      id: ****,
      type: 'public-key',
      transports: [
        'internal',
        'hybrid'
      ]
    }, {
      id: ****,
      type: 'public-key',
      transports: [
        'internal',
        'hybrid'
      ]
    }, ...]
  };

  const credential = await navigator.credentials.get({
    publicKey: publicKeyCredentialRequestOptions,
    signal: abortController.signal
  });

  // This does not run until the user selects a passkey.
  const credential = {};
  credential.id = cred.id;
  credential.rawId = cred.id; // Pass a Base64URL encoded ID string.
  credential.type = cred.type;
  
  // ...
}

PublicKeyCredentialDescriptor オブジェクトは、次のものから構成されます。

  • id: RP がパスキー登録時に取得した公開鍵認証情報の ID。
  • type: 通常、このフィールドは 'public-key' です。
  • transports: この認証情報を保持するデバイスでサポートされているトランスポートのヒント。ブラウザが外部デバイスを提示するようユーザーに求める UI を最適化するために使用されます。このリストを指定する場合、リストには、各認証情報の登録時に getTransports() を呼び出した結果が含まれている必要があります。

概要

検出可能な認証情報を使用すると、ユーザー名の入力をスキップできるため、パスキーによるログインがよりユーザー フレンドリーになります。residentKeyrequireResidentKeyallowCredentials を組み合わせることで、RP は次のようなログイン エクスペリエンスを実現できます。

  • モーダル アカウント セレクタを表示します。
  • パスキーのフォームの自動入力を表示します。
  • 再認証。

検出可能な認証情報を慎重に使用してください。そうすることで、ユーザーがシームレスにアクセスして利用しやすい、洗練されたパスキーのログイン エクスペリエンスをデザインできます。