2024年12月にAmazon Cognito(以下、"Cognito")がパスキーに対応しました。
で、遅ればせながらCognitoでパスキーを使おうと思ったところちょっと嵌ったので共有します。
まずはCognitoで以下の設定を行います。
- Sign-in > Multi-factor authentication > MFA enforcement
- Optional MFAを設定
- Authentication methods > Passkey
- ManagedLoginを使用しているならCognito prefix domainかCustom domainを選択
- 独自のログイン画面を作っているならThird-party domainを選択
- Sign-in > choice-based sign-in > Available choices
- Passkeyを選択
- App clients > App client > Authentication flows
- ALLOW_USER_AUTHを選択
Webアプリケーションで各ユーザーのパスキーを登録する処理は以下のようになります。
- まずはCognitoへユーザー名とパスワードでログインしてアクセストークンを取得します。
- CognitoのStartWebAuthnRegistrationを呼び出してパスキーの登録プロセスを開始します。
- CognitoのStartWebAuthnRegistrationから提供された情報を基に、ブラウザのnavigator.credentials.create()を呼び出して認証デバイスで認証してもらいクレデンシャルを作成します。
- クレデンシャルをCompleteWebAuthnRegistrationに渡してCognitoにパスキーの登録を完了します。
続いて実際にパスキーを使用した認証です。
以下のようになります。
- CognitoのAdminInitiateAuthに以下のパラメーターを指定して認証フローを開始します。
- AuthFlow: USER_AUTH
- AuthParameters.PREFERRED_CHALLENGE: WEB_AUTHN
- CognitoのAdminInitiateAuthから提供された情報を基に、ブラウザのnavigator.credentials.get()を呼び出して認証デバイスで認証してもらいクレデンシャルを取得します。
- CognitoのAdminRespondToAuthChallengeに以下のパラメーターとクレデンシャルを渡してパスキーを検証します。
- ChallengeName: WEB_AUTHN
- 問題がなければこれでトークンが発行されるはずです!

