📝

Cognito ユーザーアカウントの確認ステータスと email_verified 属性を API で変更する方法

2025/02/08に公開

結論

ユーザーアカウントのステータスについて

ユーザーアカウントのサインアップと確認 - Amazon Cognito
ユーザーアカウントのステータスは以下の 5 つです。

  • 登録済み (未確認)
  • 確認済み
  • パスワードのリセットが必要
  • パスワードの強制変更
  • Disabled

ユーザーのセルフサービスサインアップの場合

ユーザーアカウントのサインアップと確認 - Amazon Cognito

ユーザープールで確認メッセージを自動的に送信しないにも関わらず、誰でもアカウントにサインアップできるようにしたい場合があります。このモデルでは、たとえば、新しい登録リクエストを人間が確認したり、サインアップの一括検証と処理を行ったりする余地があります。Amazon Cognito コンソール、または IAM 認証された API オペレーション AdminConfirmSignUp を使用して新しいユーザーアカウントを確認できます。ユーザープールが確認メッセージを送信するかどうかにかかわらず、ユーザーアカウントを管理者として確認できます。

ユーザーのセルフサービスサインアップ後のステータスは「登録済み (未確認)」です。
この場合にステータスを確認済みにする方法は 2 つあります。

  • コンソールから変更する方法
  • AdminConfirmSignUp API を使用する方法

今回は例として、AWS CLI の sign-up コマンドでサインアップした場合を紹介します。
なお、Cognito ユーザープールについては以下のブログと同様の設定で作成しています。
今から始める Amazon Cognito 入門 #1:ユーザープールと ID プールの違い | DevelopersIO

まずは sign-up コマンドでいちユーザーとしてサインアップします。

$ aws cognito-idp sign-up \
--client-id your-client-id \
--username your-mail-address \
--password your-passward \
--user-attributes Name=email,Value=your-mail-address

{
    "UserConfirmed": false,
    "CodeDeliveryDetails": {
        "Destination": "xxx",
        "DeliveryMedium": "EMAIL",
        "AttributeName": "email"
    },
    "UserSub": "xxx",
    "Session": "xxx"
}

上記レスポンスで分かる通り UserConfirmed が false のため、sign-up コマンドを実行しただけではステータスは確認済みにはなりません。
コンソール上でも確認ステータスは未確認と表示されています。

コンソールから「アクション > アカウントの確認」でステータスを確認済みにすることもできますが、今回は AWS CLI の admin-confirm-sign-up コマンドで確認済みにします。

$ aws cognito-idp admin-confirm-sign-up \
--user-pool-id your-userpool-id \
--username your-mail-address

上記コマンド実行後に再度コンソールでステータスを確認すると、「確認済み」になっていることがわかります。

管理者として作成したユーザーの場合

ユーザーアカウントのサインアップと確認 - Amazon Cognito

この方法では、ユーザーのセルフサービスサインアップを確認することしかできません。管理者として作成したユーザーを確認するには、Permanent を True に設定した AdminSetUserPassword API リクエストを作成します。

上述の AdminConfirmSignUp API を使用する方法はユーザーのセルフサインアップの確認には使用できますが、管理者として作成したユーザーの場合には AdminSetUserPassword API を使用してステータスを変更する必要があります。

管理者として作成したユーザーの場合、初期ステータスが「パスワードを強制的に変更」になっているため、AdminConfirmSignUp API を実行しても以下のエラーが発生します。

User cannot be confirmed. Current status is FORCE_CHANGE_PASSWORD

上記ドキュメントに記載の通り、管理者として作成したユーザーのステータスを確認済みにするためには、Permanent を True に設定した AdminSetUserPassword API を実行する必要があります。

今回はコンソールから作成したユーザーに対して AWS CLI の admin-set-user-password コマンドを実行してみました。

まず、コンソールから作成した直後のユーザーのステータスは以下の通り「パスワードを強制的に変更」です。

この状態で admin-set-user-password を実行します。

$ aws cognito-idp admin-set-user-password \
--user-pool-id your-userpool-id \
--username your-user-name \
--password your-passward \
--permanent

上記コマンド実行後に再度コンソールでステータスを確認すると、「確認済み」になっていることがわかります。

email_verified 属性について

ユーザー属性の操作 - Amazon Cognito

適切な AWS アカウント 許可を持つ管理者は、ユーザーの E メールアドレスを変更し、それを検証済みとしてマークできます。

email_verified 属性はユーザーアカウントのメールアドレスが検証済みであるかどうかを示す属性です。
email_verified が false の場合、E メールによるパスワードのリセットができません。

ForgotPassword - Amazon Cognito User Pools

If neither a verified phone number nor a verified email exists, Amazon Cognito responds with an InvalidParameterException error .

AWS CLI を使用して Amazon Cognito ユーザーパスワードをリセットする | AWS re:Post

ユーザーが確認済みのメールアドレスまたは電話番号を持っていない場合、管理者は AdminResetUserPassword API を呼び出す際に次のエラーメッセージを受け取ります。

email_verified 属性を API で変更する方法

email_verified 属性を API で変更するには AdminUpdateUserAttributes API で email_verified 属性を true に設定する必要があります。

今回は AWS CLI の admin-update-user-attributes コマンドで試してみました。

まず、コンソール上でユーザーアカウントの email 属性が「未検証」であることを確認します。

この状態でパスワードのリセットを行った場合、以下のエラーが発生します。

Cannot reset password for the user as there is no registered/verified email or phone_number

上記は検証済みのメールアドレスが存在しない旨のエラーメッセージなので、admin-update-user-attributes コマンドで email_verified 属性を true に設定します。

$ aws cognito-idp admin-update-user-attributes \
--user-pool-id your-userpool-id \
--username your-user-name \
--user-attributes Name="email_verified",Value="true"

上記コマンド実行後に再度コンソールで email のステータスを確認すると、「検証済み」になっていることがわかります。

この状態であればパスワードのリセットが可能です。

まとめ

今回は Cognito ユーザーアカウントの確認ステータスと email_verified 属性を API で変更する方法を紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion