== 設定

WebAuthn4Jを利用する上で中心となるクラスは `WebAuthnManager` クラスです。
`WebAuthnManager` は登録リクエスト検証時の構成証明ステートメントの署名と信頼性の検証は、
それぞれ `AttestationStatementValidator` と `CertPathTrustworthinessValidator` インタフェースの実装に委譲します。

大多数のサイトは厳密な構成証明ステートメントの検証を必要としないことから（
https://www.w3.org/TR/webauthn-1/#sctn-no-attestation-security-attestation[WebAuthn仕様書関連個所参照] ）、
WebAuthn4Jでは構成証明ステートメントの検証をしないように `AttestationStatementValidator` と
`CertPathTrustworthinessValidator` を構成した `WebAuthnManager` のインスタンスを返却する
`WebAuthnManager.createNonStrictWebAuthnManager` ファクトリメソッドを用意しています。

もし、エンタープライズなユースケースで、認証デバイスの厳密な検証が要件である場合は、
`WebAuthnManager` クラスのコンストラクタを用いて `AttestationStatementValidator` と `CertPathTrustworthinessValidator`
の実装をコンストラクタインジェクションして構成して下さい。

=== 構成証明ステートメントの検証

構成証明ステートメントの検証は、 `AttestationStatementValidator` インタフェースの実装クラスが提供します。
構成照明ステートメント毎に、対応する実装クラスが提供されていますので、必要なValidatorからなるListを
`WebAuthnManager` クラスのコンストラクタに指定して下さい。
例えば、 `packed` のみをサポートする場合は、 `PackedAttestationStatementValidator` を唯一の要素とするListとし、
例えば、 `packed`, `tpm` をサポートする場合は、 `PackedAttestationStatementValidator` と `TPMAttestationStatementValidator`
からなるListを指定して下さい。

==== 構成証明ステートメントの信頼性の検証

構成証明ステートメント自体の信頼性の検証は、証明書パスの検証、ECDAAによる検証、自己署名のパターンがありますが、
証明書パスの検証は `CertPathTrustworthinessValidator` インタフェースの実装に検証を委ね、
ECDAAの場合は `ECDAATrustworthinessValidator` インタフェースの実装に検証が委譲されます。
WebAuthn4Jはいくつか `CertPathTrustworthinessValidator` インタフェースの実装を提供しており、
例えば `TrustAnchorCertPathTrustworthinessValidator` は `TrustAnchorResolver` インタフェースを通じて取得した
`TrustAnchor` をトラストアンカーの証明書として証明書パスの検証を行うことで構成証明ステートメントの信頼性の検証を行います。

==== トラストアンカーの取得

前節で `TrustAnchorResolver` インタフェースがトラストアンカーの取得に使用されると述べましたが、
WebAuthn4Jでは、 `TrustAnchorResolver` の実装として、`TrustAnchorResolverImpl` を提供しています。
`TrustAnchorResolverImpl` は、トラストアンカーの取得を更に `TrustAnchorsProvider` に委譲しています。
`TrustAnchorsProvider` の実装としては、Java Key Storeファイルからトラストアンカーを取得する `KeyStoreTrustAnchorsProvider` や、
https://fidoalliance.org/specs/fido-v2.0-rd-20180702/fido-metadata-statement-v2.0-rd-20180702.html[FIDO メタデータステートメント]
からトラストアンカーを取得する `MetadataStatementsTrustAnchorsProvider` が提供されています。

===== FIDO Metadata Serviceを用いたトラストアンカーの取得

WARNING: FIDO Metadata Statement関連の機能を提供する `webauthn4j-meta` モジュールは実験的な提供段階です。

FIDO Allianceでは、FIDO Metadata Serviceという、認証デバイスのメタデータを配信するサービスを提供しています。
このサービスに登録された認証デバイスの情報を活用するために、`FidoMdsMetadataItemsProvider` というクラスが提供されています。
これは、`MetadataItemsMetadataStatementsProvider` などと組み合わせることでトラストアンカーの取得に使用できます。

==== FIDO Metadata Serviceを用いた認証デバイスの脆弱性情報のチェック

`FidoMdsMetadataValidator` を用いてメタデータのステータスから、登録しようとしている認証デバイスで、
セキュリティ上の問題が報告されていないかチェックすることも可能です。
`FidoMdsMetadataValidator` は、 `CustomRegistrationValidator` の実装ですので、
<<_./deep-dive.adoc#カスタム検証ロジックの登録,カスタム検証ロジックの登録>> を参考に使用して下さい。

=== 認証デバイスの表現

認証デバイスを表現するインタフェースとして、 `Authenticator` インタフェースが存在します。
登録時に、 `RegistrationData` クラスが含む値を用いて `Authenticator` インタフェースの
インスタンスを作成し、アプリケーションの作法に則り永続化してください。認証時の検証に必要となります。
なお、永続化する際は、検索する際の利便性を考え、credentialIdをキーに永続化すると良いでしょう。
`Authenticator` インタフェースの実装クラスを設計する際は、アプリケーションの要件に合わせて拡張すると良いでしょう。
典型的には、 `Authenticator` をユーザーが識別するための名前フィールドの追加などが考えられるでしょう。

=== WebAuthn4Jが提供しない機能

WebAuthn4Jは特定のフレームワークに依存しないポータビリティを実現する為、
WebAuthnのAssertion/Attestationの検証に意図的に機能を絞り込んでおり、HTTPリクエストからのパラメータの取出、
Challengeの発行・セッションへの保存、カウンタ値の検証は具備していません。
使用する認証フレームワークに合わせて独自に実装して下さい。Spring Securityをご利用の場合は、
Spring Security WebAuthnがそれらの認証フレームワーク特化の部分の実装を提供しますので活用をご検討下さい。

