[WIP]WebAuthnのためのnavigator.credentials.create仕様読解

created: 2018/09/24 20:21 updated: 2018/09/24 21:06

最近WebAuthnにハマっているのでとりあえずnavigator.credentials.createについて仕様を読みつつ調べたことをメモしておく。
基本的には5.1.3. Create a new credentialを読解することになる。

CredentialCreationOptions

https://www.w3.org/TR/webauthn/#credentialcreationoptions-extension

navigator.credentials.createの引数にはCredentialCreationOptionsインターフェイスに準拠したオブジェクト、
つまりpublicKeyプロパティを持ち、値としてPublicKeyCredentialCreationOptionsインターフェイスに準拠したオブジェクトを持つオブジェクトを渡す。
publicKeyプロパティの他、passwordプロパティ等も定義されているが、WebAuthnを扱う場合は気にしなくてもいい。
(多分Credential Management APIの頃のもの

PublicKeyCredentialCreationOptions

https://www.w3.org/TR/webauthn/#dictdef-publickeycredentialcreationoptions

色々プロパティが定義されていて、navigator.credentials.createを使う場合これらを正確に理解することがキモになる。
以下1つずつメモ。

rp

Relying Party、つまりWebAuthnを利用するWebアプリケーションの情報を設定する。
値としてPublicKeyCredentialRpEntityインターフェイスに準拠したオブジェクトを渡す。
PublicKeyCredentialRpEntityインターフェイスはPublicKeyCredentialEntityインターフェイスを継承しているので、結果として以下3つのプロパティを持つオブジェクトとなる。

id

Relying Partyを表すID。
何でもいいわけではなく、正しいドメイン名である必要がある。
("registrable domain suffix of or is equal to the caller’s origin's effective domain"...適切な日本語は?)

このIDについてはRFC中に別途詳細の記載がある。
例えばRelying Partyが https://login.example.com:1337 なら、idにはlogin.example.comexample.comを設定可能。
省略可能で、その場合effective domainが設定される。

name

Relying Partyを表すヒューマンリーダブルな文字列。なんでもいい("WebAuthn demo"など)が、必須。
64バイトより長い場合は切り捨てられる場合がある点に注意する。

icon

Relying Partyやユーザーのアバターを表す画像のURLを設定可能。省略化。
(ただ指定してもどこで使用されるのかはわからなかった

user

ユーザー情報を設定する。
値としてPublicKeyCredentialUserEntityインターフェイスに準拠したオブジェクトを渡す。
PublicKeyCredentialUserEntityインターフェイスは上述のPublicKeyCredentialRpEntityインターフェイスと同様、
PublicKeyCredentialEntityインターフェイスを継承しているため、同様にnameプロパティとiconプロパティを設定することができる。(nameは必須
またnameプロパティ, iconプロパティ以外のプロパティとして、以下のプロパティが必要となる。

id

ユーザー識別子。RFC内に別途詳細の記載がある。最長64バイト。

displayName

ヒューマンリーダブルなユーザーの名前。64バイトより長い場合は切り捨てられる場合がある点に注意する。
存在意義がnameプロパティと競合しているような気がするが、nameプロパティはどちらかというとユーザー向けにアカウントを一意に識別できるような何がしかの情報を設定するために用意されているように見える。
(例えばメールアドレスや電話番号など

challenge

Relying Party上で生成された、リプレイ攻撃防止用のランダムな値。
少なくとも16バイト以上の、十分にランダムなバイト列を指定すべきとされている。
https://www.w3.org/TR/webauthn/#cryptographic-challenges
(MDN上では100バイト以上など? https://developer.mozilla.org/ja/docs/Web/API/WebAuthenticationAPI

timeout

処理完了までのタイムアウト(単位はミリ秒)

pubKeyCredParams

TODO

excludeCredentials

TODO

authenticatorSelection

TODO

attestation

TODO

extensions

TODO