管理者側でAmazon Cognito ユーザープールのユーザーパスワードをリセットしてみた
はじめに
以前、管理者主導でユーザー登録を行う運用ケースにおいて、Amazon Cognito ユーザープールを作成しました。
構成は以下の通りです。
今回は、ユーザーがパスワードを忘れた場合、管理者側で一時的な新しいユーザーパスワードを作成して、ユーザーが新しいパスワードに変更する方法をご紹介します。
前提として、ユーザープールは先ほど紹介した記事の通りに作成済みとします。
また、このユーザープールでは、セルフサービスのパスワードリセット機能の設定を有効にしていましたが、ユーザーが自身でパスワードをリセットできないようにする要件が発生したと仮定し、今回はこの機能を無効にします。
ユーザーを作成
まず、ユーザーを作成してからメールでの招待までを解説します。
管理者がAWSマネジメントコンソール上のCognito ユーザープールからユーザーを作成します。
ユーザー名とEメールを記載し、Eメールで招待を送信します。
[E メールアドレスを検証済みとしてマークする]のチェックは、今回の操作には影響しません。
指定したメールアドレスにユーザー名と仮パスワードが送信されます。
ログイン
それでは、新規作成されたユーザーでのログインをします。
ユーザー名と仮パスワードを入力します。
初回ログイン時、自動的にパスワード変更を要求されます。パスワードポリシーに従って、新しいパスワードを設定します。
MFAアプリケーションで登録します。
設定後、アプリケーションにログインできます。
ログイン後のユーザーステータスは、以下の通りです。
- 確認ステータス:確認済み
パスワードを再作成
ユーザーがパスワードを忘れたと管理者に連絡があったと仮定し、管理者がパスワードを再発行します。
以下の2つのパターンでそれぞれ解説します。
- 管理者側で一時的なパスワードを作成
- 管理者側で永続的なパスワード作成
一時的なパスワードを作成
管理者は、AWS CloudShellで以下のコマンドを実行することで一時的なパスワードを作成できます。このコマンドは成功時に返り値を返しません。
$ aws cognito-idp admin-set-user-password \
--user-pool-id example_user_pool_id \
--username example_user_name \
--password example_password \
--no-permanent
// コマンド実例
$ aws cognito-idp admin-set-user-password \
--user-pool-id ap-northeast-1_7qJb82oGZ \
--username test \
--password NewPassword123! \
--no-permanent
--no-permanent
によって、設定されたパスワードは一時的なものとなり、ユーザーは次回ログイン時に新しいパスワードの設定を強制されます。
コマンド実行後のユーザーステータスは、以下の通りです。一時的なパスワードを作成したため、パスワードを強制的に変更
となります
- 確認ステータス:パスワードを強制的に変更
それではログインしてみます。パスワードは、管理者側で作成したNewPassword123!
を入力します。
自動的にパスワード変更を要求されます。パスワードポリシーに従って、新しいパスワードを設定します。
MFAのパスコードを入力すると、ログイン完了します。
永続的なパスワード作成
管理者は、AWS CloudShellで以下のコマンドを実行することで永続的なパスワードを作成できます。このコマンドも成功時に返り値を返しません。
$ aws cognito-idp admin-set-user-password \
--user-pool-id example_user_pool_id \
--username example_user_name \
--password example_password \
--permanent
// コマンド実例
$ aws cognito-idp admin-set-user-password \
--user-pool-id ap-northeast-1_7qJb82oGZ \
--username test \
--password NewPassword123! \
--permanent
--permanent
によって、設定されたパスワードは永続的なものとなり、ユーザーは次回ログイン時にパスワードの変更を強制されません。
コマンド実行後のユーザーステータスは、以下の通りです。ユーザーは次回ログイン時にパスワードの変更を強制されませんので、確認ステータスは変わりません。
- 確認ステータス:確認済み
それではログインしてみます。パスワードは、管理者側で作成したNewPassword123!
を入力します。
パスワード変更画面はなく、MFAのパスコードを入力すると、ログイン完了します。
AdminResetUserPasswordは利用不可
今回のケースですと、AdminResetUserPassword
APIは利用できず、エラーになります。
$ aws cognito-idp admin-reset-user-password \
--user-pool-id ap-northeast-1_7qJb82oGZ \
--username test
An error occurred (NotAuthorizedException) when calling the AdminResetUserPassword operation: This userpool does not have password recovery mechanism, the administrator must set a new password.
日本語訳
「AdminResetUserPassword 操作を呼び出す際に NotAuthorizedException エラーが発生しました:このユーザープールにはパスワード回復メカニズムがありません。管理者が新しいパスワードを設定する必要があります。」
このエラーメッセージは、ユーザープールの設定でセルフサービスのパスワードリセット機能が有効になっていないことを示しています。この場合、ユーザー自身がパスワードをリセットすることはできず、代わりに管理者が直接新しいパスワードを設定する必要があります。
AWS ドキュメントにも記載されています。
To use this API operation, your user pool must have self-service account recovery configured. Use AdminSetUserPassword if you manage passwords as an administrator.
(日本語訳:このAPI操作を使用するには、ユーザープールでセルフサービスアカウント回復が設定されている必要があります。管理者としてパスワードを管理する場合は、AdminSetUserPasswordを使用してください。)
https://docs.aws.amazon.com/ja_jp/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html
マネジメントコンソールでも同様にパスワードリセットできません。
セルフサービスのパスワードリセット機能が有効化されている場合、可能です。
対処方法としては、今回紹介しましたadmin-set-user-password コマンドを使用して管理者が直接新しいパスワードを設定することになります。
最後
本記事では、Amazon Cognito ユーザープールにおいて、管理者がユーザーのパスワードをリセットする方法について解説しました。主なポイントは以下の通りです。
-
セルフサービスのパスワードリセット機能を無効にした場合、管理者がパスワードリセットを行う必要があります。
-
パスワードリセットには
admin-set-user-password
コマンドを使用します。 -
このコマンドには2つのオプションがあります。
--permanent
:設定されたパスワードは永続的となり、ユーザーは次回ログイン時にパスワード変更を強制されません。--no-permanent
:設定されたパスワードは一時的となり、ユーザーは次回ログイン時に新しいパスワードの設定を強制されます。
-
AdminResetUserPassword
APIは、セルフサービスのパスワードリセット機能が無効の場合は使用できません。
これらの方法を適切に使用することで、ユーザーのパスワード管理をより柔軟かつセキュアに行うことができます。組織のセキュリティポリシーや運用方針に応じて、最適な方法を選択してください。
参考