AWS コマンドラインインターフェイス (AWS CLI) を使用して、ユーザーが Amazon Cognito でパスワードをリセットまたは変更できるようにしたいと考えています。
解決策
注: AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI でのエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。次のコマンドでは、VALID-ACCESS-TOKEN、USER-POOL-ID、CLIENT-ID、USERNAME、CONFIRMATION-CODE、NEW-PASSWORD、PREVIOUS-PASSWORD をそれぞれ実際の値に置き換えてください。
ユーザーとしてパスワードを変更する
注: change-password コマンドを実行するには、ユーザーはサインインしているユーザーのアクセストークンを持っている必要があります。アクセストークンには aws.cognito.signin.user.admin スコープが含まれている必要があります。
ユーザーとしてパスワードを変更するには、次の change-password コマンドを実行します。
aws cognito-idp change-password --previous-password PREVIOUS-PASSWORD --proposed-password NEW-PASSWORD --access-token VALID-ACCESS-TOKEN
管理者としてユーザーパスワードをリセットする
管理者がユーザーのパスワードをリセットするには、ユーザーはユーザープールに確認済みのメールアドレスまたは電話番号を持っている必要があります。管理者が admin-reset-user-password コマンドを実行すると、Amazon Cognito はユーザーの確認済み連絡方法に確認コードを自動的に送信します。
管理者として、次の admin-reset-user-password コマンドを実行してユーザーのパスワードをリセットします。
aws cognito-idp admin-reset-user-password --user-pool-id USER-POOL-ID --username USERNAME
注: 管理者がパスワードをリセットした後にユーザーがサインインしようとすると、"PasswordResetRequiredException" エラーが表示されます。次に、Amazon Cognito はユーザーをパスワードを忘れた場合のフローにリダイレクトします。
管理者が admin-reset-user-password コマンドを実行した後、ユーザーは次の confirm-forgot-password コマンドを実行して新しいパスワードを設定します。
aws cognito-idp confirm-forgot-password --client-id CLIENT-ID --username USERNAME --confirmation-code CONFIRMATION-CODE --password NEW-PASSWORD
ユーザーが確認済みのメールアドレスまたは電話番号を持っていない場合、管理者には "An error occurred (InvalidParameterException) when calling the AdminResetUserPassword operation: Cannot reset password for the user as there is no registered/verified email or phone_number" というメッセージが送信されます。
この問題を解決するには、管理者は次の admin-update-user-attributes コマンドを実行してユーザーの連絡先情報を確認し、email_verifed 属性、または phone_number_verifed を true に設定します。
aws cognito-idp admin-update-user-attributes --user-pool-id USER-POOL-ID --username USERNAME --user-attributes Name="email_verified",Value="true"
管理者がユーザーの連絡先情報を確認したら、管理者は admin-reset-user-password コマンドを再度実行できます。ユーザーが確認コードを受け取ったら、ユーザーは confirm-forgot-password コマンドを実行して新しいパスワードを設定できます。
それでもユーザーが確認コードを受け取らない場合は、「ForgotPassword API を使用しても、Amazon Cognito から確認コードのメールまたは SMS テキストメッセージが送信されなかった原因を教えてください」を参照してください。
管理者として永続的パスワードまたは一時パスワードを設定します
ユーザーの永続的パスワードを設定するには、管理者は次の admin-set-user-password コマンドを実行します。
aws cognito-idp admin-set-user-password --user-pool-id USER-POOL-ID --username USERNAME --password NEW-PASSWORD --permanent
これで、ユーザーは新しい永続的パスワードでサインインできます。
ユーザーの一時パスワードを設定するには、管理者は次の admin-set-user-password コマンドを実行します。
aws cognito-idp admin-set-user-password --user-pool-id USER-POOL-ID --username USERNAME --password TEMPORARY-NEW-PASSWORD --no-permanent
管理者が一時パスワードを設定すると、ユーザーのステータスは FORCE_CHANGE_PASSWORD に変わります。ユーザーが一時パスワードでサインインすると、ユーザーは NEW_PASSWORD_REQUIRED チャレンジを受け取ります。
注: パスワードチャレンジを完了するまでのセッショントークンの有効期間は 3 分間です。アプリクライアントの認証フローの期間設定で有効期間を変更できます。
次に、ユーザーは次の respond-to-auth-challenge コマンドを実行して新しいパスワードを設定します。
aws cognito-idp respond-to-auth-challenge --client-id CLIENT-ID --challenge-name NEW_PASSWORD_REQUIRED --challenge-responses USERNAME=example_username,NEW_PASSWORD="example_new_password" --session "example_session_token"
重要: アプリクライアントにクライアントシークレットを設定した場合、ユーザーはユーザープールにアクセスするために respond-to-auth-challenge コマンドにシークレットハッシュパラメータを含める必要があります。ユーザーが "Unable to verify secret hash for client" というエラーを受け取った場合は、「Amazon Cognito ユーザープール API から返される、クライアントのシークレットハッシュを検証できないことを示すエラーのトラブルシューティング方法を教えてください」を参照してください。