Cognitoユーザープールにメール認証によるMFAを導入#1401
Conversation
14489d8 to
17b0122
Compare
|
This PR is stale because it has been open for 30 days with no activity. |
|
#1433 の変更の取り込み・動作確認を実施します。 |
|
This PR is stale because it has been open for 30 days with no activity. |
|
#1433 の変更の取り込み・動作確認が完了しました。 今後の開発マイルストーンに照らし合わせて、本PRで修正が必要な箇所がありましたらご連絡いただけますと幸いです。 |
maekawataiki
left a comment
There was a problem hiding this comment.
Contribution ありがとうございます!レビューが遅れ失礼いたしました。
以下の点に加えて、MFA の有効化方法についてのドキュメントを追加いただけますと幸いです!
| samlCognitoDomainName: z.string().nullish(), | ||
| samlCognitoFederatedIdentityProviderName: z.string().nullish(), | ||
| mfaEnabled: z.boolean().default(false), | ||
| mfaFromEmail: z.string(), |
There was a problem hiding this comment.
MFA 無効時でも必須フィールドになっており cdk.json では書かれているので問題ないですが parameter.ts などで環境ごとに指定が必要になってしまうのでデフォルト値をここで設定するのはいかがでしょうか?
例
mfaFromEmail: z.string().email().default('no-reply@example.com'),
| samlAuthEnabled: false, | ||
| samlCognitoDomainName: '', | ||
| samlCognitoFederatedIdentityProviderName: '', | ||
| mfaEnabled: true, |
There was a problem hiding this comment.
既存環境へ影響がないことをテストする意味で、デフォルトの Snapshot は mfa 無効で mfa 有効の Snapshot Test を切り出すのはいかがでしょうか?
|
レビューいただきありがとうございます。対応が完了しましたので連絡いたします。 ソースコードの修正
MFAの有効化方法についてのドキュメントの追加 ご確認の程よろしくお願いいたします。 |
maekawataiki
left a comment
There was a problem hiding this comment.
追加で2点ほどコメントいたしました。ご確認いただけますと幸いです。
| }) | ||
| : undefined; | ||
|
|
||
| const userPool = new UserPool(this, 'UserPool', { |
There was a problem hiding this comment.
Cognito の Feature Plan は Essentials 以上でないと Email MFA が使えません。
- Feature Plan 概念が導入される前から存在するアカウントでは、新規作成 User Pool のデフォルトは LITE のまま
- 概念導入後に作成されたアカウントでは新規 User Pool のデフォルトが ESSENTIALS
という挙動の差があり、今の実装ですと古い環境ではデプロイに失敗するようです。
以下のように明示的に MFA 有効化する際は Essential 指定することで古い環境でもデプロイできました。
featurePlan: props.mfaEnabled ? FeaturePlan.ESSENTIALS : undefined,
| samlCognitoDomainName: z.string().nullish(), | ||
| samlCognitoFederatedIdentityProviderName: z.string().nullish(), | ||
| mfaEnabled: z.boolean().default(false), | ||
| mfaFromEmail: z.string().email().default('no-reply@example.com'), |
There was a problem hiding this comment.
すみません、こちら default 値指定したほうがいいかもしれないとコメントさせていただいたのですが、検証されたメールを設定しないとデプロイ時エラーになるため 「mfaEnabled の際は検証されたメールを明示的に入力する必要がある」を徹底するために、ここでは nullish にして refine でデプロイ前にエラーメッセージを表示する形にしたほうが良いかもしれません。
// 既存の refine に追加
.refine(
(data) => !data.mfaEnabled || !!data.mfaFromEmail,
{ message: 'mfaFromEmail is required when mfaEnabled is true', path: ['mfaFromEmail'] }
)
Description of Changes
Please explain the changes in detail.
If there is any impact on existing users (compatibility, degradation, breaking changes, etc.), be sure to include it in the explanation.
CognitoユーザープールへMFA有効化を追加し、ログイン時にメールを用いたMFAを可能としました。
変更内容
cdk.jsonに以下の設定パラメータを追加しましたmfaEnabled: MFA機能の有効/無効を制御(デフォルト: false)mfaFromEmail: MFA認証コード送信元メールアドレス(例:no-reply@example.com)mfaReplyToEmail: 返信先メールアドレス(オプション)デプロイ済み環境への影響
mfaEnabledのデフォルト値はfalseのため、デプロイ済み環境への影響はありませんcdk.jsonでmfaEnabled: true,mfaFromEmailに送信元メールアドレスをに設定し、SESの事前設定を完了させてからCDKスタックの更新が必要です注意事項
MFA有効化時はパスワードリセットが制限されます
AWS公式ドキュメントに記載の通り、CognitoユーザープールではMFAとパスワードリセットコードを同じメールアドレス(または電話番号)で受け取ることができません
メールベースのMFAを有効化した場合、セルフサービスでパスワードリセットを行うにはSMS(電話番号)が必要ですが、電話番号を必須属性として追加することは既存のCognitoユーザープールへの破壊的変更となるため、本PRでは以下の対応としました
補足事項
SESドメイン認証
mfaFromEmailで指定するメールアドレスのドメインは、Amazon SESで認証済みである必要がありますcdk.jsonにて任意の値を設定可能ですAmazon SESの独自ドメイン認証設定スクリプト(注意: Route 53のDNS設定を書き換えます)
メールのカスタマイズの制限
Checklist
npm run cdk:testand if there are snapshot differences, executenpm run cdk:test:update-snapshotto update snapshotsRelated Issues
Please list related issues as much as possible.