雲のメモ帳

猫とクラウドと旅行が好きなインフラエンジニアです。 日々の調べたことや興味が持ったことをこのブログにアウトプットします。

CognitoのTOTPを利用する場合の注意点

※注意 2019年10月時点の情報です。 本記事の内容は、AWS側でアップデートがありそうな内容なため、適宜公式ドキュメントをご確認ください。

Cognitoでは、SMSとTOTPの2つのMFA要素があります。
公式のドキュメントでは、TOTPを推奨としていますが、現時点ではTOTPに登録したMFAデバイスの紛失などがあった場合に TOTPの復旧ができません
MFAデバイスの回復コードの発行や、TOTPを無効化することができないことが理由となります。

Cognito ユーザープールのMFA設定を「optional」とした環境で、TOTPを有効にしたユーザーのMFAを解除しようとしたところコマンドうまく通りませんでした。 GithubのIssueでも同様の現象が記載されていたので、現時点では仕様な模様。 (Issueの中でCognito の開発チームと連携すると記載されているので、今後の対応に期待ですね。

I actually was able to then able to submit another MFA challenge answer after that user.sendMFASelectionAnswer('SOFTWARE_TOKEN_MFA', () => {}) call with TOTP answer login now. This is very strange because this user should have MFA disabled. Getting preferred MFA type returns NOMFA

https://github.com/aws-amplify/amplify-js/issues/2906

上記のように一度設定したTOTPを解除できないため、デバイスの紛失など上がった場合にユーザーを再発行しなければならない状況となりそうです。
ユーザー再発行以外の対応法があれば、教えてください、、、
SMSとTOTPどちらも有効にして、デバイスを紛失したユーザーにはSMSを使ってもらうことで回避もできそう(未検証)な感じがありますが、根本的な解決にはならなそう。

結論

2019年10月時点 では、Cognitoで利用するMFAを 「SMS」 とするのが賢明かもしれません。
「TOTP」 を利用したい場合は、現時点での仕様を考慮しサービスとしての作りこみが必要だと思います。