1. はじめに
このセクションは規定ではありません。
ウェブサイトへのサインインは、理想よりも難しいものです。ユーザーエージェントは、ユーザー体験を様々な方法で向上させる独自の立場にあり、ほとんどの現代的なユーザーエージェントは、ブラウザでネイティブに認証情報管理機能をある程度備えています。例えば、ユーザーはウェブサイトのユーザー名やパスワードを保存でき、後でそれらの認証情報がサインインフォームに自動入力されますが、その成功度は様々です。
autocomplete
属性は、ウェブサイトがユーザーエージェントと協力してサインインフォームの検出・自動入力機能を向上させる宣言的な仕組みを提供します。特定のフィールドを「ユーザー名」や「パスワード」としてマークすることで、ユーザーエージェントは、こうした詳細をマークアップで提供していないウェブサイトにも対応するため、さまざまな検出ヒューリスティックを実装しています。
このヒューリスティックと宣言的検出の組み合わせは比較的うまく機能しますが、現状には検出が困難な大きなギャップが残っています。例えば、一般的でないサインインの仕組み(XMLHttpRequest
[XMLHTTPREQUEST]で認証情報を送信する場合など)は、確実な検出が困難です。また、ユーザーがフェデレーテッドIDプロバイダーを用いて認証したいという、近年増加しているケースも同様です。ウェブサイトがユーザーエージェントの認証情報マネージャーとより直接的にやり取りできれば、認証情報マネージャーの精度が向上し、フェデレーテッドサインインの支援も可能になります。
これらのユースケースについては、§ 1.1 ユースケースおよび認証情報管理:ユースケースと要件で詳しく説明されています。本仕様は、ウェブサイトが認証情報をユーザーのために要求したり、サインインが成功した際にユーザーエージェントへ認証情報の保存を依頼できる「Credential Manager API」を定義し、その要件の多くに対応することを目的としています。
注: ここで定義するAPIは意図的に小さくシンプルです。認証自体を提供するものではなく、既存ユーザーエージェントが実装する認証情報管理機能へのインターフェースのみに限定しています。この機能は、ベンダーや著者の大きな負担なしに今すぐ役立つものです。もちろん、今後さらに多くのことが可能です。今後の課題は§ 9 今後の課題をご覧ください。
1.1. ユースケース
現代のユーザーエージェントは、ウェブサイトへのサインイン時にパスワードを保存できる機能や、ユーザーが再訪した際にサインインフォームへ自動または半自動でパスワードを入力する機能を備えています。ウェブサイト側から見ると、この動作は完全に不可視です:パスワードが保存されたことも、フォームに入力されたこともサイトは知りません。これは良い面も悪い面もあります。一方では、ユーザーエージェントのパスワードマネージャーはサイトの協力がなくても機能し、ユーザーにとって有益です。もう一方では、パスワードマネージャーの動作は、サインインフォームやパスワード変更フォームの検出などを目的とした脆弱で独自のヒューリスティックの寄せ集めになっています。
現状の課題として、特に以下の点が挙げられます:
-
ユーザーエージェントはフェデレーテッドIDプロバイダーによるユーザー支援が非常に困難です。ユーザー名/パスワードフォームの検出は比較的容易ですが、サードパーティによるサインインの検出は確実に行うのが難しいです。ウェブサイトが典型的なフェデレーテッドサインインのリダイレクトの意図をユーザーエージェントに伝えられれば理想的です。
-
同様に、ユーザーエージェントは単純なユーザー名/パスワードフォーム以外の特殊なサインイン手法の検出に苦労しています。著者は
XMLHttpRequest
などを使って非同期的にサインイン処理を行うことが増えています。これはユーザーにとって良い体験ですが、ユーザーエージェントのパスワードマネージャーへの統合は困難です。ウェブサイトが独自のサインイン方式についてユーザーエージェントに伝えられれば理想的です。 -
最後に、パスワード変更は、ウェブサイトが明示的に認証情報の変更をユーザーエージェントに通知すれば、より良いサポートが可能です。
2. コアAPI
開発者視点では、認証情報とは、特定の操作に対して認証判断を行うためのオブジェクトです。本セクションでは、Credential
インターフェースをベースクラスとして定義します。これは本仕様や他の仕様書で定義される認証情報の基盤となり、navigator.credentials.*
にぶら下がるAPI群から取得できます。
各種認証情報タイプは、それぞれJavaScript上で、継承によって、直接的または間接的にCredential
インターフェースを基盤としています。本仕様書では、PasswordCredential
とFederatedCredential
の2つを定義しています。その他、例えば[WEBAUTHN]では他の認証情報タイプが定義されています。
認証情報が特定のオリジンに有効であるとは、そのオリジンで認証として受理されることを指します。認証情報がある時点で有効であっても、UAは同じ認証情報が将来的にも有効だと仮定できない理由がいくつかあります:
-
パスワード認証情報は、アカウント保有者がパスワードを変更した場合、有効でなくなる可能性があります。
-
SMSで受け取ったトークンで作成された認証情報は、1回限りの利用のみ有効な場合が多いです。
使い捨て認証情報は、認証情報ソースによって生成されます。これは秘密鍵、フェデレーテッドアカウントへのアクセス、特定の電話番号でSMS受信できる能力などであり、JavaScriptで直接扱うことはできず、本仕様でも明示的に表現されません。モデルを統一するため、パスワード自体も認証情報ソースと見なし、これをコピーしてパスワード認証情報を作成します。
UAは、有効な認証情報が再度有効であるとは限らない、あるいは有効な認証情報を生成した認証情報ソースが将来も有効な認証情報を生成できるとは限らないものの、後者の方が可能性として高いです。過去に有効だった認証情報をstore()
で記録すれば、UAは今後ユーザーに提示する際、より有効な認証情報ソースを提供できる可能性が高まります。
2.1. インフラストラクチャ
ユーザーエージェントは、ベンダー固有かつ不透明なストレージメカニズムである認証情報ストアを内部的に必ず提供しなければなりません。これは、どの認証情報が有効だったかを記録します。以下の認証情報アクセスおよび永続化機能を備えています:
-
認証情報リストの取得。任意のフィルターを受け取り、該当する認証情報セットを返します。
さらに、認証情報ストアは、サイレントアクセス防止
フラグをオリジンごとに管理すべきです(特に指定がない限りtrue
に設定)。オリジンのフラグがtrue
なら、そのオリジンはユーザー操作が必要となります。
注: ユーザー操作の重要性は§ 5 ユーザーメディエーションで詳述されています。
注: 認証情報ストアは本仕様のAPI実装におけるユーザーエージェントの内部実装詳細であり、ウェブに直接公開されません。特定の認証情報タイプをサポートするため、他の文書でさらに機能が指定される場合があります。
本仕様はアルゴリズムや記述に用いる基盤概念としてInfra現行標準に依存しています [INFRA]。
各環境設定オブジェクトは、関連付けられたアクティブ認証情報タイプ(初期状態は空の集合)を持ちます。
2.1.1. インフラストラクチャアルゴリズム
2.1.1.1. 祖先も同一オリジンであること
環境設定オブジェクト(settings)が祖先も同一オリジンであるかどうかは、以下のアルゴリズムがtrue
を返す場合です:
-
settingsの関連グローバルオブジェクトに関連付けられたDocumentがなければ、
false
を返す。 -
documentをsettingsの関連グローバルオブジェクトの関連付けられたDocumentとする。
-
documentにブラウジングコンテキストがなければ、
false
を返す。 -
originをsettingsのオリジンとする。
-
navigableをdocumentのノードナビゲーブルとする。
-
navigableが非nullの親を持つ間:
-
navigableをnavigableの親にする。
-
navigableのアクティブドキュメントのオリジンがoriginと同一オリジンでなければ、
false
を返す。
-
-
true
を返す。
2.1.2. 認証情報タイプレジストリ
このレジストリは認証情報タイプ(例:[[type]]
値)を、指定された認証情報タイプに関連する様々な値へマッピングします。例えば、オプションメンバー識別子(正式には辞書メンバーの識別子)は、CredentialCreationOptions
やCredentialRequestOptions
(すなわち「オプション辞書」)で仕様ごとに使われます。
注: このレジストリは関連する認証情報インターフェースオブジェクトアルゴリズムで利用されます。
認証情報タイプ (アルファベット順) | オプションメンバー識別子 | 適切なインターフェースオブジェクト | 取得パーミッションポリシー | 作成パーミッションポリシー | 仕様 | 申請者連絡先 |
---|---|---|---|---|---|---|
digital-credential | digital | DigitalCredential
| digital-credentials-get | null | [DIGITAL-CREDENTIALS] | WICG |
federated | federated | FederatedCredential
| null | null | 本仕様:§ 4 フェデレーテッド認証情報 | W3C |
identity | identity | IdentityCredential
| identity-credentials-get | null | [FEDCM] | W3C |
otp | otp | OTPCredential
| otp-credentials | null | [WEB-OTP] | WICG |
password | password | PasswordCredential
| null | null | 本仕様:§ 3 パスワード認証情報 | W3C |
public-key | publicKey | PublicKeyCredential
| publickey-credentials-get | publickey-credentials-create | [WEBAUTHN] | W3C |
2.1.2.1. 登録エントリ要件および更新プロセス
-
各レジストリエントリは、認証情報仕様の
CredentialCreationOptions
およびCredentialRequestOptions
で拡張される辞書メンバーの識別子(レジストリではオプションメンバー識別子と呼ばれる)を明記しなければなりません。 -
各レジストリエントリは、適切なインターフェースオブジェクトの識別子を明記しなければなりません。
-
各レジストリエントリは、取得パーミッションポリシーのパーミッション(認証情報の要求実行時に使用)か、パーミッションポリシーが指定されていなければnullを明記しなければなりません。
-
各レジストリエントリは、作成パーミッションポリシーのパーミッション(認証情報の作成実行時に使用)か、パーミッションポリシーが指定されていなければnullを明記しなければなりません。
-
各レジストリエントリの仕様には申請者の連絡先情報を含めなければなりません。
このレジストリの更新は、認証情報タイプのレジストリエントリの追加・変更・削除です。誰でもwebappsec-credential-managementリポジトリへのプルリクエストで更新を申請できます。 Webアプリケーションセキュリティ作業部会が次回会議の議題に載せ申請者に通知します。 審議と決定はW3C Webアプリケーションセキュリティ作業部会の合意によります。 議長が申請者に結果を通知し、レジストリを更新します。
2.2.
Credential
インターフェース
[Exposed =Window ,SecureContext ]interface {
Credential readonly attribute USVString id ;readonly attribute DOMString type ;static Promise <boolean >isConditionalMediationAvailable ();static Promise <undefined >willRequestConditionalCreation (); };
id
, 型 USVString, 読み取り専用-
認証情報の識別子です。識別子の要件は各認証情報タイプごとに異なります。例えば、ユーザー名/パスワードの組み合わせの場合はユーザー名を表すことがあります。
type
, 型 DOMString, 読み取り専用-
この属性のgetterはオブジェクトのインターフェースオブジェクトの
[[type]]
スロットの値を返します。これはこのオブジェクトが表す認証情報タイプを指定します。 isConditionalMediationAvailable()
-
ユーザーエージェントがクレデンシャル要求の仲介に対して
conditional
方式をサポートしている場合に限り、true
で解決されるPromise
を返します。そうでなければfalse
で解決されます。この判定はクレデンシャルタイプごとに行われます。Credential
のisConditionalMediationAvailable()
のデフォルト実装:-
resolveされたpromiseで
false
を返す。
条件付きメディエーションをサポートする認証情報タイプの仕様は、この関数を
true
でresolveするよう明示的にオーバーライドする必要があります。注: この関数が存在しなければ、
conditional
メディエーションは認証情報タイプでサポートされません。 -
willRequestConditionalCreation()
-
ユーザーエージェントが
conditional
アプローチによる認証情報生成のメディエーションで認証情報を生成する意図を登録した後にresolveされるPromise
を返します。Credential
のwillRequestConditionalCreation()
のデフォルト実装:-
resolveされたpromiseで
undefined
を返す。
注: このメソッドが存在しなければ、
conditional
メディエーションによる認証情報生成は認証情報タイプでサポートされません。 -
[[type]]
-
Credential
のインターフェースオブジェクトには[[type]]
という内部スロットがあり、 これは認証情報タイプを示す文字列です。特に指定がない限り値は空文字列です。§ 2.1.2 認証情報タイプレジストリで認証情報タイプ一覧を参照できます。注:
[[type]]
スロットの値は特定のインターフェースを実装するすべての認証情報で同じなので、開発者はobj.type
の返す文字列が そのCredential
の種別を明確に判別できることを信頼できます。 [[discovery]]
-
Credential
のインターフェースオブジェクトには[[discovery]]
という内部スロットがあり、 ユーザーエージェントが指定型の認証情報を収集する仕組みを表します。値は "credential store
" または "remote
"です。前者は利用可能な認証情報すべてがユーザーエージェントの認証情報ストアに保存されていることを意味し、 後者は外部デバイスやサービスとのやり取りによって認証情報ストアに明示的に表現されていない認証情報も発見できることを意味します。
TobieやDominicとインターフェースオブジェクトについて相談してください。ここや§ 2.5.1 認証情報の要求など、用語が正しいか不明です。インターフェースプロトタイプオブジェクトかもしれません?
一部のCredential
オブジェクトはオリジンに束縛される型です。これらは[[origin]]
という内部スロットを持ち、オリジンを格納します。これは当該Credential
が有効となり得るオリジンです。
2.2.1.
Credential
の内部メソッド
Credential
のインターフェースオブジェクトは、認証情報オブジェクトの取得・保存を補助するいくつかの内部メソッドを備えています。これらのデフォルトは本節で示す「no-op」です。
特に指定がない限り、Credential
を継承するインターフェースごとに作成されるインターフェースオブジェクトは、少なくとも1つの内部メソッドの実装を提供し、該当する認証情報タイプに合わせてCredential
のデフォルト実装をオーバーライドしなければなりません。例:§ 3.2 PasswordCredentialインターフェース、§ 4.1 FederatedCredentialインターフェース、[WEBAUTHN]。
2.2.1.1. [[CollectFromCredentialStore]]
内部メソッド
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
はorigin、CredentialRequestOptions
、
呼び出し元の環境設定オブジェクトが祖先も同一オリジンである場合にtrueとなるboolean値を受け取ります。
このアルゴリズムは、ユーザーエージェントの認証情報ストアから、指定したオプションに一致するCredential
オブジェクトの集合を返します。一致するCredential
がなければ、空集合を返します。
Credential
の
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
のデフォルト実装:
-
空集合を返す。
2.2.1.2. [[DiscoverFromExternalSource]]
内部メソッド
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
は並行してorigin、CredentialRequestOptions
、
呼び出し元の環境設定オブジェクトが祖先も同一オリジンである場合にtrueとなるboolean値を受け取ります。
オプションに応じて返せる場合はCredential
を返し、
利用可能な認証情報がなければnull
、発見に失敗すれば(例:オプション不正の場合はTypeError
)エラーを投げます。
単回利用や有効期間限定の場合は、このメソッドが認証情報ソースを使って新たに認証情報を生成します。
Credential
の
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
のデフォルト実装:
-
null
を返す。
2.2.1.3. [[Store]]
内部メソッド
[[Store]](credential, sameOriginWithAncestors)
は
並行してCredential
、
呼び出し元の環境設定オブジェクトが祖先も同一オリジンである場合にtrueとなるboolean値を受け取ります。
このアルゴリズムは、Credential
を認証情報ストアに永続化したら終了します。
Credential
の
[[Store]](credential, sameOriginWithAncestors)
のデフォルト実装:
-
NotSupportedError
を投げる。
2.2.1.4. [[Create]]
内部メソッド
[[Create]](origin, options, sameOriginWithAncestors)
は並行してorigin、CredentialCreationOptions
、
呼び出し元の環境設定オブジェクトが祖先も同一オリジンである場合にtrueとなるboolean値を受け取ります。
アルゴリズムは以下のいずれかを行います:
-
Credential
を作成する、または -
認証情報を作成せず
null
を返す、または -
例外的状況でエラーを投げる(例:オプションが不正なら
TypeError
)。
認証情報を作成する場合は、グローバルオブジェクトを受け取り、Credential
を継承するインターフェースオブジェクトを返すアルゴリズムを返します。このアルゴリズムはタスクから呼び出されなければなりません。
注: このアルゴリズムの手順は各認証情報タイプごとに定義されます。
Credential
の
[[Create]](origin, options, sameOriginWithAncestors)
のデフォルト実装:
-
null
を返す。
2.2.2.
CredentialUserData
ミックスイン
一部のCredential
オブジェクトは、認証情報選択画面でユーザーに分かりやすい名称やアイコンを表示するためのデータを持ちます:
[SecureContext ]interface mixin {
CredentialUserData readonly attribute USVString name ;readonly attribute USVString iconURL ; };
name
, 型 USVString, 読み取り専用-
認証情報に関連する名称で、認証情報選択画面で表示する人間が理解できる公開名を意図します。
iconURL
, 型 USVString, 読み取り専用-
認証情報用アイコン画像のURLで、認証情報選択画面で表示されることを意図しています。このURLは潜在的に信頼できるURLでなければなりません。
2.3.
navigator.credentials
開発者はCredential
を取得し、ユーザーエージェントの認証情報ストアとやり取りするために、CredentialsContainer
インターフェースのメソッドを利用します。これはNavigator
オブジェクトのnavigator.credentials
として提供されます。
partial interface Navigator { [SecureContext ,SameObject ]readonly attribute CredentialsContainer credentials ; };
credentials
属性は、アクティブドキュメントのブラウジングコンテキストに関連付けられたCredentialsContainer
を必ず返さなければなりません。
注: § 6.3 安全でないサイトで述べている通り、認証情報管理APIはセキュアコンテキストでのみ公開されます。
[Exposed =Window ,SecureContext ]interface {
CredentialsContainer Promise <Credential ?>get (optional CredentialRequestOptions options = {});Promise <undefined >store (Credential credential );Promise <Credential ?>create (optional CredentialCreationOptions options = {});Promise <undefined >preventSilentAccess (); };dictionary {
CredentialData required USVString ; };
id
get(options)
-
get()
が呼び出されると、ユーザーエージェントは 認証情報の要求をoptions
に対して実行した結果を返さなければなりません。CredentialsContainer.get(options)メソッドの引数。 パラメーター 型 Nullable Optional 説明 options
CredentialRequestOptions
✘ ✔ リクエスト範囲を管理するプロパティセット。 store(credential)
-
store()
が呼び出されると、ユーザーエージェントは 認証情報の保存をcredential
に対して実行した結果を返さなければなりません。CredentialsContainer.store(credential)メソッドの引数。 パラメーター 型 Nullable Optional 説明 credential
Credential
✘ ✘ 保存する認証情報。 create(options)
-
create()
が呼び出されると、ユーザーエージェントは 認証情報の作成をoptions
に対して実行した結果を返さなければなりません。CredentialsContainer.create(options)メソッドの引数。 パラメーター 型 Nullable Optional 説明 options
CredentialCreationOptions
✘ ✔ Credential
作成に利用するオプション。 preventSilentAccess()
-
preventSilentAccess()
が呼び出されると、 ユーザーエージェントはサイレントアクセス防止を現在の設定オブジェクトに対して実行した結果を返さなければなりません。注: これはオリジン側がユーザーのサインアウトを示すシグナルです。つまり、「サインアウト」ボタンのクリック後、サイトがユーザーのセッション情報を更新し、
navigator.credentials.preventSilentAccess()
を呼び出します。これによりサイレントアクセス防止フラグが設定され、次回ユーザーが訪問した際に認証情報が自動で返されなくなります。注: この関数は以前
requireUserMediation()
と呼ばれていましたが、非推奨と考えてください。
Navigator
オブジェクト(navigator)が作成される際、ユーザーエージェントはnavigatorの関連Realmを用いて新しいCredentialsContainer
オブジェクトを作成し、
navigatorに関連付けなければなりません。
2.3.1. CredentialRequestOptions
辞書
get()
でCredential
を取得するには、
呼び出し側がCredentialRequestOptions
オブジェクトでいくつかのパラメーターを指定します。
注: CredentialRequestOptions
辞書は拡張ポイントです。新しい認証情報タイプで追加オプションが必要になった場合、その辞書型を拡張してリクエストに渡すことができます。§ 8.2 拡張ポイント参照。
dictionary {
CredentialRequestOptions CredentialMediationRequirement mediation = "optional";AbortSignal signal ; };
mediation
, 型 CredentialMediationRequirement、デフォルト値は"optional"
-
このプロパティは認証情報リクエストのメディエーション要件を指定します。各enum値の意味は下記
CredentialMediationRequirement
で説明されています。 処理詳細は§ 2.5.1 認証情報の要求を参照してください。 signal
, 型 AbortSignal-
このプロパティは開発者が進行中の
get()
操作を中断するために利用します。 中断された操作は通常通り完了する場合もあり(一般的に中断が操作完了後に受信された場合)、また中断理由でrejectされる場合もあります。
unmediated
メンバーが定義されていました。これをtrue
に設定すると、mediation
が
"silent
"、
false
に設定すると
mediation
が"optional
"となる効果がありました。
unmediated
は非推奨と考え、新しいコードではmediation
を利用してください。
CredentialCreationOptions
またはCredentialRequestOptions
(options)に対する関連する認証情報インターフェースオブジェクトは、以下の手順で収集される
インターフェースオブジェクトの集合です:
注: このアルゴリズムは認証情報タイプレジストリを利用します。
-
settingsを現在の設定オブジェクトとする。
-
optionsの各optionKey→optionValueについて:
-
credentialInterfaceObjectを、settingsのグローバルオブジェクト上で オプションメンバー識別子がoptionKeyである適切なインターフェースオブジェクトとする。
-
Assert: credentialInterfaceObjectの
[[type]]
スロットは、 オプションメンバー識別子がoptionKeyである 認証情報タイプに等しい。 -
credentialInterfaceObjectをrelevant interface objectsに追加する。
-
-
relevant interface objectsを返す。
CredentialRequestOptions
(options)が事前に一致可能(matchable a
priori)かどうかは、以下のステップがtrue
を返す場合です:
-
optionsの関連する認証情報インターフェースオブジェクトの各interfaceについて:
-
interfaceの
[[discovery]]
スロットの値が "credential store
" でなければfalse
を返す。
-
-
true
を返す。
注: get(options)
を実行する際、ユーザー仲介なしでクレデンシャルを返すのは、
指定されたCredentialRequestOptions
が事前にマッチ可能(a
priori)な場合のみです。OAuthトークンやセキュリティキー認証器など、外部サービスからの発見が必要となるクレデンシャルタイプがリクエストされた場合は、発見処理を導くため(フェデレーテッドアイデンティティプロバイダー、BTLEデバイス等の選択)、ユーザー仲介が必須となります。
2.3.2. メディエーション要件
get(options)
やcreate(options)
のリクエスト時、開発者はCredentialMediationRequirement
列挙型の値を選択することで、個別にユーザー操作の要件を設定できます。
注: § 5 ユーザーメディエーションで、この概念の詳細や、ユーザーエージェントが特定のオリジンに対する個々のリクエストをどのように扱うかについて説明しています。
enum {
CredentialMediationRequirement "silent" ,"optional" ,"conditional" ,"required" };
silent
-
この操作ではユーザー操作が抑制されます。ユーザー操作なしで処理できる場合はそのまま実行されます。ユーザー操作が必要な場合は、ユーザーを介さずに
null
を返します。注: 主な用途は「このサイトにサインインしたままにする」シナリオです。自動サインインが可能な場合は認証情報を静かに取得し、ユーザーが能動的にサインインを選択するまでサインインプロンプトで邪魔しないようにします。
optional
-
ユーザー操作なしで認証情報を渡せる場合は渡します。ユーザー操作が必要な場合は、ユーザーエージェントがユーザーに判断を委ねます。
注: これは
get()
のデフォルト動作です。ユーザーが「サインイン」ボタンを押した直後など、サインイン操作を期待している場合に最適です。必要なら認証情報選択画面が出ても、ユーザーは戸惑いません。 conditional
-
get()
の場合、発見された認証情報は非モーダルダイアログでユーザーに表示され、認証情報要求元のオリジンも示されます。ユーザーがダイアログ外で操作すると、Promiseはresolve/rejectせず、ユーザー向けエラーも発生しません。認証情報を選択すると、その認証情報が返されます。サイレントアクセス防止フラグは実際の値にかかわらずtrue
として扱われます:conditional動作では、該当認証情報が見つかった場合は必ずユーザー操作が発生します。認証情報が見つからない場合、ユーザーエージェントは認証情報タイプに応じて何らかのアクション(例:デバイス挿入)を促すことができます。いずれにせよ、
get()
は即座にnull
でresolveして、認証情報がないことをサイトに知らせてはなりません。Webサイトは、参照するすべての認証情報インターフェースが
isConditionalMediationAvailable()
をtrue
でresolveするようオーバーライドしている場合のみconditional
をget()
に渡せます。create()
の場合、ユーザーが以前認証情報の生成に同意していて、直近にユーザーエージェントが認証を媒介したことが分かっていれば、追加のモーダル操作なしでresolveできます。最近ユーザー認証を媒介していないか、認証情報生成の同意がなければ"NotAllowedError
"DOMException
を投げなければなりません。 required
-
たとえオリジンのサイレントアクセス防止フラグが未設定でも、ユーザー操作なしで認証情報は渡されません。
注: これは再認証やユーザー切り替えのケースに適しています。この要件は特定の操作にのみ適用され、オリジンのサイレントアクセス防止フラグには影響しません。フラグを設定するには
preventSilentAccess()
を呼び出してください。
2.3.2.1. 例
get()
を呼び出し、mediation
プロパティに
"silent
"をセットして渡すことでこれを実現できます。
これにより、§ 5.2
ユーザーメディエーションの要求で説明されているように、ユーザー操作不要に同意したユーザーは自動サインインされ、同意していない場合は不意な認証情報選択画面で戸惑うことがありません。
window.addEventListener('load', async () => { const credentials = await navigator.credentials.get({ ..., mediation: 'silent' }); if (credentials) { // 認証情報でユーザーをサインイン! } });
document.querySelector('#sign-in').addEventListener('click', async () => { const credentials = await navigator.credentials.get({ ..., mediation: 'optional' }); if (credentials) { // 認証情報でユーザーをサインイン! } });
get()
でmediation
プロパティを
"required
"にセットすれば、
ユーザーエージェントが必ずユーザー操作を介するようにできます。
注: ブラウザや認証情報タイプのセキュリティモデルによっては、認証情報をサイトに渡す前に、マスターパスワード入力や指紋認証などが要求される場合があります。
document.querySelector('#important-form').addEventListener('submit', async () => { const credentials = await navigator.credentials.get({ ..., mediation: 'required' }); if (credentials) { // |credentials|でアクセス可能か確認し、不正なら送信をキャンセル } else { e.preventDefault(); } });
get()
でmediation
プロパティを
"required
"にセットし、
「アカウント追加」ボタンのクリック時に認証情報が自動で返らないようにできます:
document.querySelector('#switch-button').addEventListener('click', e => { var c = await navigator.credentials.get({ ..., mediation: 'required' }); if (c) { // |c|でユーザーをサインイン } });
2.4. CredentialCreationOptions
辞書
create()
でCredential
を作成するには、
呼び出し側がCredentialCreationOptions
オブジェクトでいくつかのパラメーターを指定します。
注: CredentialCreationOptions
辞書は拡張ポイントです。新しい認証情報タイプが導入される際には、この辞書に追加され、作成メソッドに渡せます。§ 8.2 拡張ポイント、本仕様で導入されている拡張(§ 3.2 PasswordCredentialインターフェース、§ 4.1 FederatedCredentialインターフェース)も参照してください。
dictionary {
CredentialCreationOptions CredentialMediationRequirement = "optional";
mediation AbortSignal signal ; };
signal
, 型 AbortSignal-
このプロパティは開発者が進行中の
create()
操作を中断するために利用します。中断された操作は通常通り完了する場合もあり(一般的に中断が操作完了後に受信された場合)、また中断理由でrejectされる場合もあります。
2.5. アルゴリズム
2.5.1. Credential
の要求
Credential
の要求アルゴリズムはCredentialRequestOptions
(options)を受け取り、一意に取得できる場合はCredential
でresolve、そうでなければnull
でresolveするPromise
を返します。
-
settingsを現在の設定オブジェクトとする。
-
Assert: settingsはセキュアコンテキストである。
-
documentをsettingsの関連グローバルオブジェクトの関連付けられたDocumentとする。
-
documentが完全にアクティブでなければ、"
InvalidStateError
"DOMException
でpromiseをrejectして返す。 -
options.
が中断済みなら、signal
options.
の中断理由でpromiseをrejectして返す。signal
-
interfacesをoptionsの関連する認証情報インターフェースオブジェクトとする。
-
interfacesが空なら、 "
NotSupportedError
"DOMException
でpromiseをrejectして返す。 -
interfacesの各interfaceについて:
-
options.
mediation
がconditional
で、 interfaceがconditional
なユーザー操作をサポートしないなら、"TypeError
"DOMException
でpromiseをrejectして返す。 -
settingsのアクティブ認証情報タイプがinterfaceの
[[type]]
を含んでいれば、 "NotAllowedError
"DOMException
でpromiseをrejectして返す。 -
settingsのアクティブ認証情報タイプにinterfaceの
[[type]]
を追加する。
-
-
originをsettingsのoriginとする。
-
sameOriginWithAncestorsを、settingsが祖先も同一オリジンなら
true
、それ以外はfalse
とする。 -
optionsの関連する認証情報インターフェースオブジェクトの各interfaceについて:
-
permissionをinterfaceの
[[type]]
の取得パーミッションポリシーとする。 -
permissionがnullなら、次へ。
-
documentがpermissionの利用許可がないなら、"
NotAllowedError
"DOMException
でpromiseをrejectして返す。
-
-
pを新しいpromiseとする。
-
以下の手順を並行して実行:
-
credentialsを認証情報ストアからCredentialを収集(origin、options、sameOriginWithAncestors)の結果とする。
-
以下すべてがtrueなら、pをcredentials[0]でresolveし、残り手順をスキップ:
-
credentialsのサイズが1
-
originがユーザー操作不要
-
optionsが事前に一致可能
-
options.
mediation
が "conditional
"でない
このモデルは誤っているかもしれません。WebAuthn型認証情報でも、ユーザー名/パスワードを使うユーザーには選択画面を表示しないままサインインできるようにしたい。
-
-
options.
mediation
が "silent
"なら、pをnullでresolveし、残り手順をスキップ。 -
resultをユーザーにCredential選択を依頼(options、credentials)の結果とする。
-
resultがインターフェースオブジェクトなら:
-
resultを、resultの
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
(origin、options、sameOriginWithAncestors)の結果にする。例外が発生した場合:
-
発生した例外をeとする。
-
globalのDOM操作タスクソースでタスクをキューし、以下を実行:
-
pをeでrejectする。
-
-
以降の手順を終了。
-
-
-
Assert: resultは
null
またはCredential
。 -
resultが
Credential
なら、pをresultでresolveする。 -
resultが
null
かつoptions.mediation
がconditional
でない場合、pをresultでresolveする。注: options.
mediation
がconditional
であり、null
な認証情報が発見された場合、promise pはresolveされません。
-
-
-
interfacesの各interfaceについて:
-
interfaceの
[[type]]
をsettingsのアクティブ認証情報タイプから削除する。
-
-
-
pを返す。
2.5.2. 認証情報ストアからCredential
を収集
origin(origin)、
CredentialRequestOptions
(options)、および呼び出しコンテキストが祖先も同一オリジン(sameOriginWithAncestors)の場合のみtrue
となるboolean値が与えられたとき、ユーザーエージェントは認証情報ストアからCredential
を収集できる。
これは、ユーザーエージェントがローカルに保存しているoptionsのフィルターに一致するCredential
オブジェクトの集合を返す。該当するCredential
オブジェクトがなければ、空集合を返す:
-
possible matchesを空集合とする。
-
optionsの関連する認証情報インターフェースオブジェクトの各interfaceについて:
-
rをinterfaceの
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
内部メソッド(引数はorigin、options、sameOriginWithAncestors)の実行結果とする。例外が発生した場合は、その例外を再スローする。 -
Assert: rはインターフェースオブジェクトのリストである。
-
rの各cについて:
-
possible matchesにcを追加する。
-
-
-
possible matchesを返す。
2.5.3. Credential
の保存
Credential
の保存アルゴリズムは
Credential
(credential)を受け取り、オブジェクトが認証情報ストアに永続化されるとresolveする
Promise
を返す。
-
settingsを現在の設定オブジェクトとする。
-
Assert: settingsはセキュアコンテキストである。
-
settingsの関連グローバルオブジェクトの関連付けられたDocumentが完全にアクティブでなければ、 "
InvalidStateError
"DOMException
でpromiseをrejectして返す。 -
現在の設定オブジェクトが祖先も同一オリジンなら
true
、それ以外はfalse
としたsameOriginWithAncestorsを定める。 -
pを新しいpromiseとする。
-
settingsのアクティブ認証情報タイプがcredentialの
[[type]]
を含んでいれば、 "NotAllowedError
"DOMException
でpromiseをrejectして返す。 -
settingsのアクティブ認証情報タイプにcredentialの
[[type]]
を追加する。 -
以下の手順を並行して実行:
-
credentialのインターフェースオブジェクトの
[[Store]](credential, sameOriginWithAncestors)
内部メソッド(引数はcredential、sameOriginWithAncestors)を実行する。例外が発生した場合:
-
発生した例外をeとする。
-
globalのDOM操作タスクソースでタスクをキューし、以下を実行:
-
pをeでrejectする。
-
例外が発生しない場合は、pをundefinedでresolveする。
-
-
-
-
credentialの
[[type]]
をsettingsのアクティブ認証情報タイプから削除する。
-
-
pを返す。
2.5.4. Credential
の作成
Credential
の作成アルゴリズムは
CredentialCreationOptions
(options)を受け取り、指定されたオプションで作成できる場合はCredential
でresolveし、作成できない場合はnull
でresolveする
Promise
を返します。例外的な状況では、Promise
は適切な例外でrejectされる場合があります。
-
settingsを現在の設定オブジェクトとする。
-
Assert: settingsはセキュアコンテキストである。
-
globalをsettingsのグローバルオブジェクトとする。
-
documentを関連グローバルオブジェクトの関連付けられたDocumentとする。
-
documentが完全にアクティブでなければ、"
InvalidStateError
"DOMException
でpromiseをrejectして返す。 -
現在の設定オブジェクトが祖先も同一オリジンなら
true
、それ以外はfalse
としたsameOriginWithAncestorsを定める。 -
interfacesをoptionsの関連する認証情報インターフェースオブジェクトの集合とする。
-
次のいずれかがtrueなら
NotSupportedError
でpromiseをrejectして返す:-
globalに関連付けられたDocumentがない。
-
interfacesのサイズが1より大きい。
注: 今後この制限を緩和し、ユーザーエージェントが複数の認証情報タイプから選択できる「サインアップ」ユースケースをサポートする可能性はありますが、現時点では辞書は1エントリに制限されています。
-
-
interfacesの各interfaceについて:
-
permissionをinterfaceの
[[type]]
の作成パーミッションポリシーとする。 -
permissionがnullなら次へ。
-
documentがpermissionの利用許可がない場合、"
NotAllowedError
"DOMException
でpromiseをrejectして返す。
-
-
options.
が中断済みなら、signal
options.
の中断理由でpromiseをrejectして返す。signal
-
typeをinterfaces[0]の
[[type]]
とする。 -
settingsのアクティブ認証情報タイプがtypeを含んでいれば、 "
NotAllowedError
"DOMException
でpromiseをrejectして返す。 -
settingsのアクティブ認証情報タイプにtypeを追加する。
-
originをsettingsのoriginとする。
-
pを新しいpromiseとする。
-
以下の手順を並行して実行:
-
rをinterfaces[0]の
[[Create]](origin, options, sameOriginWithAncestors)
内部メソッド(引数はorigin、options、sameOriginWithAncestors)の実行結果とする。例外が発生した場合:
-
発生した例外をeとする。
-
globalのDOM操作タスクソースでタスクをキューし、以下を実行:
-
pをeでrejectする。
-
-
以降の手順を終了。
-
-
rが
Credential
またはnull
なら、pをrでresolveし、以降の手順を終了。 -
Assert: rは(§ 2.2.1.4 [[Create]]内部メソッドで定義される)アルゴリズムである。
-
globalのDOM操作タスクソースでタスクをキューし、以下を実行:
-
-
-
settingsのアクティブ認証情報タイプからtypeを削除する。
-
-
pを返す。
2.5.5. サイレントアクセスの防止
サイレントアクセスの防止アルゴリズムは環境設定オブジェクト(settings)を受け取り、認証情報ストアにサイレントアクセス防止
フラグが永続化されるとresolveするPromise
を返します。
-
originをsettingsのoriginとする。
-
settingsの関連グローバルオブジェクトの関連付けられたDocumentが完全にアクティブでなければ、 "
InvalidStateError
"DOMException
でpromiseをrejectして返す。 -
pを新しいpromiseとする。
-
以下の手順を並行して実行:
-
originのサイレントアクセス防止フラグを認証情報ストアに設定する。
-
-
pを返す。
3. パスワード認証情報
良いか悪いかは別として、多くのウェブサイトは認証手段としてユーザー名/パスワードの組み合わせに依存しています。
PasswordCredential
インターフェースは、このユースケースを実現するための認証情報であり、ユーザー名とパスワード両方を保存し、
認証情報選択画面でユーザーが正しいアカウントを選びやすくするメタデータも保持します。
3.1. 例
3.1.1. パスワードによるサインイン
navigator.credentials.get()
を使って
ユーザーの認証情報ストアからユーザー名/パスワードの組み合わせを取得できます:
navigator.credentials .get({ 'password': true }) .then(credential => { if (!credential) { // ユーザーがこのサイト用の認証情報を持っていない、または // 共有を拒否した場合。ここで通常のログインフォームへのフォールバック処理を実装。 return; } if (credential.type == 'password') { var form = new FormData(); form.append('username_field', credential.id); form.append('password_field', credential.password); var opt = { method: 'POST', body: form, credentials: 'include' // クッキー送信 }; fetch('https://example.com/loginEndpoint', opt) .then(function (response) { if (/* |response| がログイン成功を示す場合 */) { // 認証情報が有効だったことを記録(下記注参照) navigator.credentials.store(credential); // サインイン成功を通知して、サインイン後の処理を実行! // location.href = '/signed-in-experience' なども可能 } else { // 通常のログインフォームへのフォールバック処理 } }); } });
また、ウェブサイトは認証情報データを
form
にコピーして、submit()
を呼び出すこともできます:
navigator.credentials .get({ 'password': true }) .then(credential => { if (!credential) { return; // 上記と同様... } if (credential.type === 'password') { document.querySelector('input[name=username_field]').value = credential.id; document.querySelector('input[name=password_field]').value = credential.password; document.getElementById('myform').submit(); } });
前者の方法(fetch後にstore()
を明示的に呼ぶ)が推奨されます。
form
ベースの方法はフォーム送信に依存し、ブラウジングコンテキストが遷移するため、サインイン成功後に確実にstore()
を呼ぶのが難しくなります。
注: ユーザーエージェントが提示する認証情報選択画面では、現在のオリジンに保存されていない認証情報も選択できる場合があります。例えば、https://m.example.com
の認証情報が
https://www.example.com
で利用可能として表示されることがあります(§ 6.1
クロスドメイン認証情報アクセス参照)。
または、ユーザーが新しい認証情報を即時作成できる場合もあります。開発者は、store()
を認証情報が利用されるたび(get()
直後でも)呼ぶことで、未保存なら保存の機会が提示され、すでに保存済みならユーザーへのプロンプトも表示されません。
3.1.2. サインイン後の確認
サインイン成功後に新しい認証情報の保存をユーザーに提案するには、その認証情報をstore()
に渡します。
fetch()
でサインインエンドポイントに認証情報を送信した場合、レスポンスでサインイン成功を確認し、ユーザーエージェントに通知できます。例えば次のようなサインインフォームの場合:
<form action="https://example.com/login" method="POST" id="theForm"> <label for="username">ユーザー名</label> <input type="text" id="username" name="username" autocomplete="username"> <label for="password">パスワード</label> <input type="password" id="password" name="password" autocomplete="current-password"> <input type="submit"> </form>
フォーム送信は次のようなハンドラで処理できます:
document.querySelector('#theForm').addEventListener('submit', e => { if (window.PasswordCredential) { e.preventDefault(); // "submit"イベント発火元のPasswordCredentialを // HTMLFormElementから生成 // "username"や"current-password"のautocomplete属性値を吸い上げる var c = new PasswordCredential(e.target); // フォームのaction URLに新しい認証情報オブジェクト(FormData)を送信。成功ならユーザーエージェントに通知してパスワード保存を提案: var opt = { method: 'POST', body: new FormData(e.target), credentials: 'include' // クッキー送信 }; fetch(e.target.action, opt).then(r => { if (/* |r| が"成功した" Response */) navigator.credentials.store(c); }); } });
3.1.3. パスワード変更
この保存機構は「パスワード変更」にもそのまま利用できます。ユーザーが認証情報を変更した場合、ウェブサイトは新しい認証情報でサインイン成功を通知できます。ユーザーエージェントは保存済み認証情報を更新します:
store()
を呼ぶことで認証情報更新可能です。
パスワード変更フォーム例:
<form action="https://example.com/changePassword" method="POST" id="theForm"> <input type="hidden" name="username" autocomplete="username" value="user"> <label for="password">新しいパスワード</label> <input type="password" id="password" name="password" autocomplete="new-password"> <input type="submit"> </form>
フォーム送信は次のように処理できます:
document.querySelector('#theForm').addEventListener('submit', e => { if (window.PasswordCredential) { e.preventDefault(); // "submit"イベント発火元のPasswordCredentialを // HTMLFormElementから生成 // "username"や"new-password"のautocomplete属性値を吸い上げる var c = new PasswordCredential(e.target); // フォームのaction URLに新しい認証情報オブジェクト(FormData)を送信。成功ならユーザーエージェントに通知してパスワード保存を提案: var opt = { method: 'POST', body: new FormData(e.target), credentials: 'include' // クッキー送信 }; fetch(e.target.action, opt).then(r => { if (/* |r| が"成功した" Response */) navigator.credentials.store(c); }); } });
3.2.
PasswordCredential
インターフェース
[Exposed =Window ,SecureContext ]interface :
PasswordCredential Credential {constructor (HTMLFormElement );
form constructor (PasswordCredentialData );
data readonly attribute USVString password ; };PasswordCredential includes CredentialUserData ;partial dictionary CredentialRequestOptions {boolean =
password false ; };
password
, 型 USVString, 読み取り専用-
認証情報のパスワードを表します。
[[type]]
-
PasswordCredential
のインターフェースオブジェクトは[[type]]
という内部スロットを持ち、その値は"password
"です。 [[discovery]]
-
PasswordCredential
のインターフェースオブジェクトは[[discovery]]
という内部スロットを持ち、その値は"credential store
"です。 PasswordCredential(form)
-
このコンストラクターは
HTMLFormElement
(form)を受け取り、以下の手順を実行します:-
originを現在の設定オブジェクトのoriginとする。
-
rをHTMLFormElementから
PasswordCredential
を作成(form、origin)の結果とする。
-
PasswordCredential(data)
-
このコンストラクターは
PasswordCredentialData
(data)を受け取り、以下の手順を実行します:-
rをPasswordCredentialDataから
PasswordCredential
を作成(data)の結果とする。
-
PasswordCredential
オブジェクトはPasswordCredentialData
辞書を明示的に渡すか、HTMLFormElement
の
送信可能要素の内容に基づいて
navigator.credentials.create()
で作成できます。
dictionary :
PasswordCredentialData CredentialData {USVString ;
name USVString ;
iconURL required USVString ;
origin required USVString ; };
password typedef (PasswordCredentialData or HTMLFormElement );
PasswordCredentialInit partial dictionary CredentialCreationOptions {PasswordCredentialInit ; };
password
PasswordCredential
オブジェクトはオリジンに束縛されます。
PasswordCredential
の
インターフェースオブジェクトはCredential
の
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
の実装を継承し、
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
、
[[Create]](origin, options, sameOriginWithAncestors)
、
[[Store]](credential, sameOriginWithAncestors)
を独自実装します。
3.3. アルゴリズム
3.3.1.
PasswordCredential
の
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
は、origin(origin)、CredentialRequestOptions
(options)、
および呼び出しコンテキストが祖先も同一オリジン
(sameOriginWithAncestors)の場合のみtrueとなるboolean値を受け取ります。
このアルゴリズムは認証情報ストアからCredential
オブジェクトの集合を返します。一致するCredential
がなければ空集合を返します。
sameOriginWithAncestorsがtrueでない場合、NotAllowedError
を投げます。
-
sameOriginWithAncestorsがfalseなら、"
NotAllowedError
"DOMException
を投げる。注: この制限は§ 6.4 オリジン混同の懸念に対応しています。
-
options["
password
"] がtrueでなければ空集合を返す。 -
認証情報ストアから取得によって 以下のフィルタに一致する認証情報を返す:
-
認証情報が
PasswordCredential
である -
認証情報の
[[origin]]
がoriginと同一オリジンである
-
3.3.2. PasswordCredential
の
[[Create]](origin, options, sameOriginWithAncestors)
[[Create]](origin, options, sameOriginWithAncestors)
は、origin(origin)、CredentialCreationOptions
(options)、および呼び出しコンテキストが祖先も同一オリジン(sameOriginWithAncestors)の場合のみtrueとなるboolean値を受け取ります。
このアルゴリズムは、作成できる場合はPasswordCredential
を、そうでなければnull
を返します。CredentialCreationOptions
辞書は必ずpassword
メンバーを持ち、その値はHTMLFormElement
またはPasswordCredentialData
でなければなりません。
その値からPasswordCredential
を作成できない場合、このアルゴリズムはTypeError
例外を投げます。
-
Assert: options["
password
"] 存在する、かつsameOriginWithAncestorsは未使用。 -
options["
password
"] がHTMLFormElement
なら、 HTMLFormElementからPasswordCredential
を作成(options["password
"]、origin)の結果を返す。 例外は再スローすること。 -
options["
password
"] がPasswordCredentialData
なら、 PasswordCredentialDataからPasswordCredential
を作成(options["password
"])の結果を返す。 例外は再スローすること。
3.3.3.
PasswordCredential
の[[Store]](credential, sameOriginWithAncestors)
[[Store]](credential, sameOriginWithAncestors)
は
PasswordCredential
(credential)と、呼び出しコンテキストが祖先も同一オリジンの場合のみtrueとなるboolean値を受け取ります。アルゴリズムはcredentialが認証情報ストアに永続化されるとundefined
を返します。
sameOriginWithAncestorsがtrueでない場合、NotAllowedError
を返します。
-
sameOriginWithAncestorsがfalseの場合、"
NotAllowedError
"DOMException
を投げ、ユーザーエージェントの認証情報ストアは変更しない。注: この制限は§ 6.4 オリジン混同の懸念に対応しています。
-
ユーザーエージェントの認証情報ストアに、
PasswordCredential
(stored) があり、そのid
属性がcredentialのid
で、[[origin]]
スロットがcredentialの[[origin]]
と同一オリジンなら:-
ユーザーが認証情報の更新を許可した場合(ユーザー操作定義時参照)、
それ以外の場合、ユーザーが認証情報保存を許可した場合(ユーザー操作定義時参照):
-
以下のプロパティを持つ
PasswordCredential
を認証情報ストアに保存する:id
-
credentialの
id
name
-
credentialの
name
iconURL
-
credentialの
iconURL
[[origin]]
-
credentialの
[[origin]]
password
-
credentialの
password
-
3.3.4. HTMLFormElement
からPasswordCredential
を作成
HTMLFormElementから
PasswordCredential
を作成するには、HTMLFormElement
(form)とオリジン(origin)を受け取り、以下の手順を実行します。
注: § 3.1.2 サインイン後の確認と§ 3.1.3 パスワード変更が主な利用例です。
-
dataを新しい
PasswordCredentialData
辞書とする。 -
dataの
origin
メンバー値をorigin値に設定する。 -
formDataを
FormData
コンストラクターでformから生成する。 -
elements を、送信可能な要素のうち、form owner が form であるものを 木構造順で並べたリストとする。
-
newPasswordObservedを
false
とする。 -
elementsの各fieldについて以下を実行:
-
fieldが
autocomplete
属性を持たない場合は以降をスキップ。 -
nameをfieldの
name
属性値とする。 -
formDataの
has()
をnameに対して実行し、結果がfalse
なら以降をスキップ。 -
fieldの
autocomplete
値に1つ以上のautofill詳細トークン(tokens)が含まれている場合:-
tokensの各tokenについて:
-
tokenが以下のいずれか文字列(ASCII大文字小文字無視)と一致する場合は該当手順を実行:
- "
new-password
" -
dataの
password
メンバー値をformDataのget()
でname取得結果に設定し、newPasswordObservedをtrue
にする。 - "
current-password
" -
newPasswordObservedが
false
なら、dataのpassword
メンバー値をformDataのget()
でname取得結果に設定。注: newPasswordObservedが
false
か判定することでnew-password
フィールドがcurrent-password
より優先されます。 - "
photo
" - "
name
"- "
nickname
" - "
- "
username
"
- "
-
-
-
-
cをPasswordCredentialDataからPasswordCredentialを作成(data)の結果とする。例外発生時は再スロー。
-
Assert: cは
PasswordCredential
である。 -
cを返す。
3.3.5. PasswordCredentialData
からPasswordCredential
を作成
PasswordCredentialData
から
PasswordCredential
を作成するには、PasswordCredentialData
(data)を受け取り、以下の手順を実行します。
-
cを新しい
PasswordCredential
オブジェクトとする。 -
cの各プロパティを以下のように設定:
-
cを返す。
3.3.6. CredentialRequestOptions
によるPasswordCredential
一致判定
CredentialRequestOptions
(options)が与えられたとき、以下のアルゴリズムはMatches
(PasswordCredential
がget()
リクエスト応答として利用可能)またはDoes Not Match
(そうでない場合)を返します。
-
optionsに
password
メンバーがあり、値がtrue
ならMatches
を返す。 -
Does Not Match
を返す。
4. フェデレーテッドクレデンシャル
4.1.
FederatedCredential
インターフェース
[Exposed =Window ,SecureContext ]interface :
FederatedCredential Credential {constructor (FederatedCredentialInit );
data readonly attribute USVString provider ;readonly attribute DOMString ?protocol ; };FederatedCredential includes CredentialUserData ;dictionary {
FederatedCredentialRequestOptions sequence <USVString >;
providers sequence <DOMString >; };
protocols partial dictionary CredentialRequestOptions {FederatedCredentialRequestOptions ; };
federated
provider
, 型 USVString, 読み取り専用-
クレデンシャルのフェデレーテッドアイデンティティプロバイダー。詳細なフォーマットについては § 4.1.1 プロバイダーの識別 を参照してください。
protocol
, 型 DOMString, 読み取り専用、nullable-
クレデンシャルのフェデレーテッドアイデンティティプロバイダーのプロトコル(例: "
openidconnect
")。 値がnull
の場合は、プロトコルはprovider
から推測できます。 [[type]]
-
FederatedCredential
インターフェースオブジェクト は[[type]]
という名前の内部スロットを持ち、 値は "federated
" です。 [[discovery]]
-
FederatedCredential
インターフェースオブジェクト は[[discovery]]
という名前の内部スロットを持ち、 値は "credential store
" です。 FederatedCredential(data)
-
このコンストラクターは
FederatedCredentialInit
(data) を受け取り、以下の手順を実行します:-
r を FederatedCredentialInit から FederatedCredential を作成する を data に対して実行した結果とする。それが 例外 を投げた場合は、その例外を再スローする。
-
r を返す。
-
FederatedCredential
オブジェクトは FederatedCredentialInit
辞書を
navigator.credentials.create()
に渡すことで作成できます。
dictionary :
FederatedCredentialInit CredentialData {USVString ;
name USVString ;
iconURL required USVString ;
origin required USVString ;
provider DOMString ; };
protocol partial dictionary CredentialCreationOptions {FederatedCredentialInit ; };
federated
FederatedCredential
オブジェクトは オリジンに紐付けられています。
FederatedCredential
の
インターフェースオブジェクト は Credential
の
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
の実装を継承し、
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
、
[[Create]](origin, options, sameOriginWithAncestors)
、
[[Store]](credential, sameOriginWithAncestors)
の独自実装を定義します。
注記: 将来的にユーザーエージェントがユーザーのために認証トークンを取得できるようになった場合、
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
の実装を追加することで実現できます。
4.1.1. プロバイダーの識別
すべてのサイトは、特定のフェデレーテッドアイデンティティプロバイダーを参照する際に同じ識別子を使用するべきです。例えば Facebook Login は "Facebook" や "Facebook Login" や "FB" や "FBL" や "Facebook.com" などと呼ばず、誰もが利用できる正規の識別子を持つべきです。識別が一貫していれば、ユーザーエージェントが役立つことが可能になります。
一貫性のため、本書で定義されたAPIに渡されるフェデレーション(例: FederatedCredentialRequestOptions
の
providers
配列や FederatedCredential
の
provider
プロパティ)は、プロバイダーがサインインに使用する origin のASCIIシリアライゼーション で識別されなければなりません。
つまり、Facebookは https://www.facebook.com
、Googleは https://accounts.google.com
で表されます。
この origin のシリアライゼーションには、末尾の U+002F SOLIDUS ("/
")
は含まれませんが、ユーザーエージェントはそれを黙って受け入れるべきです: https://accounts.google.com/
は明らかに
https://accounts.google.com
と同じ意味です。
4.2. アルゴリズム
4.2.1.
FederatedCredential
の
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
は origin(origin)、CredentialRequestOptions
(options)、および呼び出し元コンテキストが 祖先と同一オリジン である場合に限り true
となるブール値(sameOriginWithAncestors)を受け取ります。
このアルゴリズムは credential store から Credential
オブジェクトの集合を返します。該当する Credential
オブジェクトが存在しない場合、返却される集合は空になります。
-
もし sameOriginWithAncestors が
false
なら、"NotAllowedError
"DOMException
を投げる。注記: この制限は § 6.4 オリジン混同 で提起された懸念に対応するためのものです。
-
もし options["
federated
"] がtrue
でなければ、空集合を返す。 -
credential store からクレデンシャルのリストを取得する の結果を、以下のフィルターに一致するもののみ返す:
4.2.2. FederatedCredential
の
[[Create]](origin, options, sameOriginWithAncestors)
[[Create]](origin, options, sameOriginWithAncestors)
は origin(origin)、CredentialCreationOptions
(options)、および呼び出し元コンテキストが 祖先と同一オリジンの場合のみ true
となるブール値(sameOriginWithAncestors)を受け取ります。
このアルゴリズムは FederatedCredential
が作成できればそれを返し、できなければ null
を返します。また、例外的な場合は 例外 を投げます:
-
Assert: options["
federated
"] 存在すること、および sameOriginWithAncestors は未使用であること。 -
FederatedCredentialInit から FederatedCredential を作成する を options["
federated
"] に対して実行した結果を返す。 それが 例外 を投げた場合は、その例外を再スローする。
4.2.3.
FederatedCredential
の [[Store]](credential, sameOriginWithAncestors)
[[Store]](credential, sameOriginWithAncestors)
は
FederatedCredential
(credential)、および呼び出し元コンテキストが 祖先と同一オリジン の場合のみ true
となるブール値(sameOriginWithAncestors)を受け取ります。
このアルゴリズムは credential を credential store に保存したら undefined
を返します。
もし sameOriginWithAncestors が true
でなければ、NotAllowedError
を返します。
-
"
NotAllowedError
"DOMException
を投げ、ユーザーエージェントの credential store を変更しない。 sameOriginWithAncestors がfalse
の場合。注記: この制限は § 6.4 オリジン混同 で提起された懸念に対応するためのものです。
-
もしユーザーエージェントの credential store に
FederatedCredential
が存在し、そのid
属性が credential のid
であり、[[origin]]
スロットが credential の[[origin]]
とprovider
が credential のprovider
である場合は、返す。 -
ユーザーがクレデンシャルの保存を許可した場合(ユーザー操作を定義するときに議論)、
FederatedCredential
を credential store に以下のプロパティで保存する:
4.2.4. FederatedCredentialInit から FederatedCredential を作成する
FederatedCredentialInit
から FederatedCredential を作成する ためには、FederatedCredentialInit
(init) を受け取り、次の手順を実行します。
5. ユーザー仲介
APIを通じてウェブにクレデンシャル情報を公開することは、ユーザーのプライバシーに関してさまざまな影響を及ぼす可能性があります。したがって、ユーザーエージェントはユーザーが何が起こっているか、誰と自分のクレデンシャルが共有されるのかを明確に理解できるように、いくつかの場合においてユーザーを関与させなければなりません。
あるアクションがユーザーの明示的な同意を得た後に行われる場合、それを ユーザー仲介 と呼びます。同意は、クレデンシャル選択インターフェースとの直接的な操作によって示される場合があります。一般的に、ユーザー仲介アクションは、ユーザーに何らかのUIを提示し、意思決定を求めることが含まれます。
アクションがユーザーの明示的な同意なしに静かに行われる場合、それは非仲介型です。例えば、ユーザーが特定のオリジンに永続的なクレデンシャルアクセスを許可するようブラウザを設定した場合、ユーザーに意思決定を求めるUIを表示せずにクレデンシャルが提供されることがあります。
ここでは、すべてのクレデンシャルタイプに共通するいくつかの要件を示しますが、ユーザーエージェント側の裁量に委ねられている部分も多くあります(ユーザーを支援できる特権的な立場にあるため)。また、特定のクレデンシャルタイプには、ここで一般的に記載されている要件を超える独自の要件がある場合もあります。
5.1. クレデンシャルの保存と更新
クレデンシャル情報は機微なデータであり、ユーザーがその情報の保存を常に管理できる必要があります。意図しないクレデンシャルの保存は、特定のデバイス上のローカルプロファイルとオンライン上の特定の人物が予期せず紐付けられる可能性があります。このような驚きのリスクを軽減するために:
-
クレデンシャル情報はユーザー仲介なしに保存や更新すべきではありません。例えば、ユーザーエージェントは
store()
の呼び出しごとに「このクレデンシャルを保存しますか?」というダイアログを表示できます。ユーザーの同意は、ユーザーエージェントが「常にパスワードを保存する」などの永続的な同意オプションを提供する場合に推測されることもあります(ただし、より範囲の狭い「常に生成されたパスワードのみ保存する」や「このサイトのパスワードのみ保存する」といった選択肢が望ましいでしょう)。
-
ユーザーエージェントはクレデンシャルが保存されたとき、ユーザーに通知すべきです。これはアドレスバーのアイコン表示などで実現できます。
-
ユーザーエージェントはユーザーが保存済みクレデンシャルを手動で削除できるようにしなければなりません。この機能は設定ページや上記の通知とのインタラクションなどで実装できます。
5.2. ユーザー仲介の要求
デフォルトでは、すべてのユーザー仲介がオリジンに対して要求されます。これは対応するサイレントアクセス防止フラグがクレデンシャルストア内で
true
に設定されているためです。ユーザーはオリジンへのクレデンシャルへの永続的なアクセスを許可することもでき(例えば「このサイトに常にログインした状態にする」オプションなど)、このフラグが
false
になります。この場合、ユーザーは常にそのサイトにログインした状態になりますが、利便性の観点では望ましいものの、場合によっては驚きの結果を招くこともあります(例えば、ユーザーエージェントがこのフラグの状態を複数のデバイス間で同期する場合など)。
驚きのリスクを軽減するために:
-
ユーザーエージェントは、特定のオリジンやすべてのオリジンに対してユーザー仲介を要求できるようユーザーに許可しなければなりません。この機能は、各オリジンのサイレントアクセス防止フラグを
false
にするグローバル切替や、特定オリジンや特定クレデンシャルに対する個別設定などで実現できます。 -
ユーザーエージェントは、オリジンのサイレントアクセス防止フラグをユーザー仲介なしに
false
にしてはなりません。例えば、クレデンシャル選択でチェックボックスを設け、ユーザーがそのオリジンに対して仲介なしでクレデンシャルを利用できるように指定できたり、クレデンシャルマネージャーの初期設定でデフォルト設定を尋ねることもできます。 -
ユーザーエージェントは、クレデンシャルがオリジンに提供された際にユーザーに通知しなければなりません。これはアドレスバーのアイコン表示などで実現できます。
-
ユーザーがオリジンの閲覧データ(Cookie、localStorageなど)をクリアした場合、ユーザーエージェントはそのオリジンのサイレントアクセス防止フラグを
true
に設定しなければなりません。
5.3. クレデンシャルの選択
get()
の呼び出しに対し、ユーザー仲介が必要なオリジンの場合、ユーザーエージェントはクレデンシャル情報の共有についてユーザーの許可を求めなければなりません。
これは、ユーザーに利用可能なクレデンシャルの一覧を提示し、どれをウェブサイトに提供するか選択したり、リクエスト自体を中止できる
クレデンシャル選択UIの形態で実装するべきです。
選択UIは、ウェブサイトが生成できるUIとは区別できるように実装されるべきです。例えば、選択UIがユーザーエージェントのUIと重なり、偽装できない方法で実装することが考えられます。
選択UIには、クレデンシャルを要求しているオリジンの表示が含まれていなければなりません。
選択UIには、要求元オリジンに関連付けられたすべてのCredential
オブジェクトが含まれているべきです。
ユーザーエージェントは、Credential
オブジェクトごとに、本書で規定されている属性以外の情報を内部的に持つことができます。例えば、ファビコンを使ってIDプロバイダーを区別するなどです。追加情報はウェブには直接公開されてはなりません。
選択UIの挙動は本書では定義しません。ユーザーエージェントは認証オプションについてユーザーを教育し、適切なクレデンシャル選択を促すUIの工夫を推奨します。ただし、選択UIのインターフェースは以下の通りです:
Credential
を選択させることができます。これは
CredentialRequestOptions
(options) と、クレデンシャルストアから取得したCredential
オブジェクトの集合(locally
discovered
credentials)を受け取ります。
このアルゴリズムは、ユーザーがクレデンシャルの共有を拒否した場合は null
、特定のクレデンシャルを選択した場合は Credential
オブジェクト、クレデンシャルのタイプのみ選択した場合はCredential
のインターフェースオブジェクトを返します。
もし options が 事前にマッチ可能でない場合、選択UIには明示的なクレデンシャルリスト以外に、関連するクレデンシャルインターフェースオブジェクトも表示するのが適切かもしれません。 例えば、サイトがWebAuthn形式の認証器を受け入れる場合、「セキュリティキー」が適切なアイコン付きで選択リストに表示されることがあります。
また、場合によってはユーザーエージェントが選択UI自体を省略することもあります。たとえば、唯一の関連するインターフェースオブジェクトがユーザー操作を必須とする場合は、ユーザーエージェントがそのインターフェースを直接返し、内部の仲介フローでユーザー同意を取得することができます。
6. セキュリティに関する考慮事項
以下の各節は、セキュリティおよびプライバシーに関するガイドラインを示しています。個々のクレデンシャルタイプは、これらのガイドラインより厳格または緩和されたバージョンを適用することがあります。
6.1. クロスドメインでのクレデンシャルアクセス
クレデンシャルは機微な情報であり、ユーザーエージェントはそれをウェブサイトと安全に共有できるタイミングについて慎重である必要があります。最も安全な選択肢は、クレデンシャルの共有を保存した正確なオリジンに限定することです。しかし、それはウェブにとって制約が厳しすぎる場合があります。たとえば、example.com
とadmin.example.com
のように機能をサブドメインに分割するサイトを考えてみてください。
ユーザーへの煩わしさとセキュリティのバランスを取るため、ユーザーエージェントは以下のようにします:
-
スキーム要素がセキュリティを低下させるオリジン間でクレデンシャルを共有してはなりません。つまり、
http://example.com/
で保存したクレデンシャルをhttps://example.com/
で利用できるようにするのは(開発者の安全な通信への移行を促すため)許容されますが、その逆は危険です。 -
ユーザーエージェントはPublic Suffix List [PSL]を使用して、クレデンシャルの有効範囲を決定してもよいです。これはクレデンシャルの登録可能ドメインと
[[origin]]
、およびget()
が呼ばれるオリジンの比較によって判断します。つまり、https://admin.example.com/
やhttps://example.com/
で保存されたクレデンシャルは、https://www.example.com/
からget()
が呼ばれた際に提示されてもよく、逆も同様です。 -
クレデンシャルのオリジンが呼び出し元オリジンと完全一致しない場合、
get()
への応答でクレデンシャルを直接提示してはなりません。必ずユーザー仲介を伴う必要があります。つまり、Credential
オブジェクトはhttps://example.com
から直接https://www.example.com
に返されることはなく、選択UIを経由してユーザーに提示する必要があります。
6.2. クレデンシャル漏洩
開発者は、クロスサイトスクリプティング攻撃がユーザーアカウントへの持続的なアクセスに繋がるリスクを軽減するため、送信先を制限する適切なContent Security Policy [CSP]を設定することが推奨されます。特に、ページのポリシーには以下のディレクティブを明示的または暗黙的に設定すべきです:
-
[=
script-src
=]と[=object-src
=]はページ上でのスクリプト実行を制限し、クロスサイトスクリプティング攻撃の成功確率を下げます。もしform
要素を利用する場合は、[=form-action
=]ディレクティブも設定してください。 -
[=
connect-src
=]はfetch()
がデータを送信できるオリジンを制限します。これにより、クレデンシャルがevil.com
へ流出するリスクを軽減します。 -
[=
child-src
=]はページに埋め込まれるネストされた閲覧コンテキストを制限し、悪意のあるpostMessage()
ターゲットの注入を困難にします。[HTML]
もちろん、開発者は入力と出力の適切なエスケープ処理や、Subresource Integrity [SRI]など、他の防御策も検討すべきです。
特定のクレデンシャルタイプを定義する際には、クレデンシャルデータの送信方法にも十分な配慮を行うべきです。例えば、同一オリジンのエンドポイントのみ送信を許可する伝送方式を定義するのが妥当かもしれません。
6.3. 安全でないサイト
ユーザーエージェントは、現行標準で定義されたAPIをセキュアコンテキストでない環境に公開してはなりません。ユーザーエージェントは、潜在的に信頼できないURL上でサインインフォームを自動入力する機能を持つことはありますが、そうしたサイトはクレデンシャルマネージャーと直接やりとりする信頼はできず、セキュアコンテキストで保存されたクレデンシャルへのアクセスは許可されません。
6.4. オリジン混同
フレーム化されたページが現行標準で定義されたAPIにアクセスできる場合、ユーザーがトップレベル閲覧コンテキスト以外のオリジンに対してクレデンシャルへのアクセス権を誤って与えてしまう可能性があります。トップレベル閲覧コンテキストこそが、ユーザーが理解できる唯一のセキュリティオリジンです。
本書では、ユーザーエージェントがUI設計に十分配慮すれば、いくつかのクレデンシャルタイプはそうしたコンテキストにも安全に公開可能と考え、Credential Management APIをそれらのコンテキストにも公開しています。
しかしながら、特定のクレデンシャルタイプはリスクなしでこうしたコンテキストに公開するのが困難です。これらのタイプは、[[Create]](origin, options, sameOriginWithAncestors)
、
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
、
[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
、
[[Store]](credential, sameOriginWithAncestors)
の各メソッドにおいて適切に制限されています。
例えば、PasswordCredential
の
[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
メソッドは、Worker
や非トップレベル閲覧コンテキストから呼ばれた場合、即座に空集合を返します。
6.5. サインアウト
ユーザーが§5.2
ユーザー仲介の要求で述べたように、ウェブサイトへの自動サインインを選択している場合、ユーザーエージェントは要求に応じてオリジンにクレデンシャルを提供します。ウェブサイトは、CredentialsContainer
の
preventSilentAccess()
メソッドを呼び出すことで、この動作を抑制できます。これにより特定のオリジンで自動サインインを停止できます。
ユーザーエージェントはウェブサイトが適切に振る舞うことに依存しています。不注意または悪意のあるウェブサイトがこのメソッドを呼ばなければ、ユーザーエージェントはユーザーの意図に反してクレデンシャルを提供し続けることになります。これは、サイトがユーザーが「サインアウト」をクリックしてもクレデンシャルを消去しない現状よりも若干悪化します。なぜなら、ユーザーエージェントが認証に加担することになるからです。
ユーザーはこの動作を制御できなければなりません。§5.2
ユーザー仲介の要求で述べた通り、オリジンのCookieを消去すると、そのオリジンのサイレントアクセス防止フラグも
クレデンシャルストア内でtrue
にリセットされます。加えて、ユーザーエージェントは特定オリジンの自動サインインを無効化できるUI(例えばクレデンシャルが提供された通知に連動したUIなど)も提供すべきです。
7. プライバシーに関する考慮事項
7.1. タイミング攻撃
ユーザーがあるオリジンに対してクレデンシャルを持っていない場合、get()
の呼び出しは非常に素早く解決されます。悪意のあるウェブサイトは、クレデンシャルを持っていないユーザーと、クレデンシャルは持っているが共有しないユーザーとを区別することができます。
ユーザーエージェントはクレデンシャル要求にレート制限を設けるべきです。短時間に何度もクレデンシャルを要求するページはほぼ確実に悪質です。
7.2. 選択UIの漏洩
ユーザーエージェントのクレデンシャル選択UIがオリジンから提供された画像(例えばCredential
がサイトのファビコンを表示する場合)を表示する場合、これらの画像のリクエストは選択UIの生成に直接紐付けてはなりません。選択UIの利用状況が漏れるのを防ぐためです。ひとつの方法は、クレデンシャルの保存や更新時に画像をバックグラウンドで取得し、クレデンシャルの有効期間中キャッシュしておくことです。
これらの画像はcredentials modeを"omit
"、
service-workers modeを"none
"、
clientをnull
、
initiatorを空文字列、
destinationを"subresource
"に設定して取得しなければなりません。
さらに、ユーザーエージェントがクレデンシャルに関連付けられた名前やアイコンをユーザーが変更できる場合、その変更内容はウェブサイトに公開されるべきではありません(例えば、ユーザーが同じオリジンの2つのクレデンシャルに「偽のアカウント」と「本物のアカウント」と名付けた場合など)。
7.3. ローカル保存データ
このAPIは、オリジンに対し、ユーザープロファイルとともにデータを永続的に保存する機能を提供します。 多くのユーザーエージェントはクレデンシャルデータを「閲覧データ」(Cookieなど)とは区別して扱うため、ユーザーがCookieを消去してオリジンの痕跡がすべて消えたと思っても、クレデンシャルが残っていて驚く可能性があります。
ユーザーエージェントは、オリジンごとにクレデンシャルデータが保存されていることをユーザーに明示するUIを提供し、不要になったデータを容易に削除できるようにすべきです。
8. 実装に関する考慮事項
この節は規範的ではありません。
8.1. ウェブサイト制作者向け
このAPIをいつ・どのように使うべきか、特にmediation
について考察を追加してください。
[Issue #w3c/webappsec#290]
fetch()
でFormData
bodyを使ってクレデンシャルを送信する場合のエンコーディング制約も記述してください。
特定のクレデンシャルタイプの機能検出を行う際は、Credential
の存在ではなく、必要な特化型が存在することを確認するのが推奨されます。前者はAPI自体の存在確認ですが、サイトで必要なクレデンシャルタイプのサポートを保証しません。例えば、パスワードが必要なサイトの場合はif (window.PasswordCredential)
で確認するのが最も効果的です。
8.2. 拡張ポイント
この文書は、特定の認証ニーズに応じたクレデンシャル タイプで拡張されることを前提とした、汎用的かつ高水準なAPIを提供しています。拡張は、以下のように行うのが望ましいです:
-
Credential
を継承した新しいインターフェースを定義します: -
[[Create]](origin, options, sameOriginWithAncestors)
、[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
、[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
、[[Store]](credential, sameOriginWithAncestors)
を新しいExampleCredential
のインターフェースオブジェクトで定義します。[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
は、永続的に有効なクレデンシャルに適しており、単純にクレデンシャルストアからコピーすればよいです。一方[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
は、再生成が必要なクレデンシャルに適しています。例えば、
PublicKeyCredential
の[[Create]](origin, options, sameOriginWithAncestors)
や[[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors)
のような長時間の処理では、options.signal
で開発者が処理を中断できるようにすることが推奨されます。詳細はDOM §3.3 AbortControllerとAbortSignalオブジェクトのAPI統合を参照してください。ExampleCredential
の[[CollectFromCredentialStore]](origin, options, sameOriginWithAncestors)
内部メソッドは、 origin(origin
)、CredentialRequestOptionsオブジェクト(options
)、呼び出し元が祖先と同一オリジンの場合のみtrueとなるブール値を受け取ります。アルゴリズムは指定されたオプションに一致するCredential
オブジェクトの集合を返します。一致するCredential
がなければ空集合を返します。-
Assert:
options
[example
]が存在する。 -
options
[example
]がtruthyでなければ空集合を返す。 -
クレデンシャルストア内の各credentialについて:
-
...
-
-
-
ExampleCredential
のインターフェースオブジェクトの[[type]]
スロットの値を定義します: -
ExampleCredential
のインターフェースオブジェクトの[[discovery]]
スロットの値を定義します: -
新しいクレデンシャルタイプに必要なオプションで
CredentialRequestOptions
を拡張し、get()
に適切に対応できるようにします: -
新しいクレデンシャルタイプで必要なデータを使って
CredentialCreationOptions
を拡張し、create()
でクレデンシャルオブジェクトを作成できるようにします: -
新しいクレデンシャルタイプが
conditional
なユーザー仲介をサポートする場合は、ExampleCredential/isConditionalMediationAvailable()
を定義し、trueで解決されるPromiseを返すようにします。 -
§2.1.2.1 登録項目要件と更新手続きに従い、新しい"example"クレデンシャルタイプと対応する以下の項目をクレデンシャルタイプレジストリに追加します:
-
CredentialCreationOptions
とCredentialRequestOptions
のOptions Member Identifier(この場合は"example"), -
適切なインターフェースオブジェクトの識別子(この場合は
ExampleCredential
),
注記: クレデンシャルタイプのオプション辞書のOptions Member Identifierは、
CredentialCreationOptions
とCredentialRequestOptions
の両方で同じでなければならず、Credential
のインターフェースオブジェクトの[[type]]
スロット値とも一致すべきです。 -
新しいプリミティブが必要になる場合もあります。例えば、複雑な多要素認証プロセスで複数のCredential
オブジェクトを返したい場合などです。この場合は、getAll()
メソッドをCredentialsContainer
に追加し、sequence<Credential>
を返すようにし、異なるタイプのクレデンシャルを要求する合理的な仕組みを定義することで対応可能です。
そのような拡張の場合は、public-webappsec@へ相談・レビューを依頼することを推奨します。
8.3. ブラウザー拡張
理想的には、拡張機能システムを実装するユーザーエージェントは、第三者がこれらAPIエンドポイントにフックして、サードパーティのクレデンシャル管理ソフトの動作をユーザーエージェント自身と同じ形で改善できるようにするべきです。
これは、ユーザーエージェントが仲介する複雑な新APIを用意する場合から、拡張機能が自分自身の目的でget()
やstore()
のエンドポイントを上書きできるようにする場合まで、幅広く考えられます。
9. 今後の課題
この節は規範的ではありません。
ここで定義したAPIは、ユーザーエージェントのクレデンシャルマネージャーをウェブに公開するための最低限の機能を提供し、ウェブがフェデレーテッドアイデンティティプロバイダーの利用状況をクレデンシャルマネージャーに伝えるのに役立ちます。次の論理的なステップは、[WEB-LOGIN] や、ある程度は Mozilla の BrowserID [BROWSERID] のような文書で概略されている方向性になるでしょう。
ユーザーエージェントは、ユーザー・アイデンティティプロバイダー・ウェブサイト間の関係を効果的に仲介できる唯一の立場にあります。ユーザーエージェントが一般的な認証フローに伴うリスクや混乱を軽減できれば、ユーザーは現在よりもはるかに良い状況になるでしょう。
この情報を公開する自然な方法としては、FederatedCredential
インターフェースを認証トークンなどのプロパティで拡張したり、プロバイダーがサポートする認証タイプを宣言するプロパティを持つマニフェスト形式を追加することが考えられます。
ここで説明したAPIは、ユーザー操作を必要とするユースケースや、クレデンシャルを要求したウェブサイト以外のサイトとのやり取りを含むユースケースにも対応できるよう十分に拡張可能となるよう設計されています。Promiseベースのシステムは、複数の閲覧コンテキスト間(例:idp.com
での仲介活動によって rp.com
にPromiseが返される場合)や、将来デバイス・ユーザーエージェント間(例:[WEBAUTHN])での非同期フローをAPI自体の再設計なしにサポートできる拡張性を持つことを期待しています。
少しずつ前進していきます。