【AWS】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」 を利用したい場合は、現時点での仕様を考慮しサービスとしての作りこみが必要だと思います。