Amazon Cognito のパスキー認証を Flask で実装する | TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
Cognito の WebAuthn 対応には、MFA(ソフトウェアトークン)を有効にするとパスキー認証フローが利用できないという排他制約がある。また、ユーザー特定前にチャレンジを発行する Discoverable Credentials にも非対応であり、メールアドレスの事前入力なしでシームレスにログインする体験の実現が困難である。
// Approach
MFA 制約に対しては Cognito 側の MFA を無効化し、pyotp を用いて Flask 側で TOTP を自前実装。Discoverable Credentials 非対応に対しては、allowCredentials: [] を用いた自前チャレンジで userHandle を取得し、SQLite でメールアドレスを特定してから Cognito 認証を開始する 2 ステップ方式を採用した。
// Result
Cognito の SDK を活用することで WebAuthn の複雑な検証ロジックを省略しつつ、プラットフォームの制約をアプリケーション層のロジックで補完。パスワードとパスキーの両方を用いた、実用的な認証基盤の構築に成功している。
Senior Engineer Insight
> Cognito の WebAuthn 対応は、サーバーサイドの検証負荷を軽減する点で極めて強力だ。しかし、MFA との排他性や Discoverable Credentials への非対応といった『仕様の隙間』が明確に存在する。これらをアプリケーション層で補完する設計(自前 TOTP や userHandle マッピング)は、実戦では避けられない判断だ。大規模運用を見据えるなら、SQLite によるマッピング管理を分散データベースへ移行し、App Client の分離管理を徹底する設計思想が不可欠である。マネージドサービスの利便性と、自前実装による複雑性のトレードオフを正しく評価すべきだ。