Невозможно отправить код подтверждения через AWS Cognito API - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть пул пользователей AWS Cognito, в котором пользователи создаются с помощью API Cognito с помощью действия AdminCreateUser , которое отлично работает. Это отправляет пользователю электронное письмо с подтверждением, содержащее временный пароль. Пока все хорошо.

Теперь пользователь не получил это электронное письмо с подтверждением, поэтому мне нужно отправить его снова, используя действие ResendConfirmationCode . Я пытаюсь сделать это с помощью приведенного ниже кода PHP.

$userPoolId = '[POOL_ID_HERE]';
$backendAppId = '[APP_ID_HERE]';
$clientSecret = '[SECRET_HERE]';
$username = '[UUID_HERE]';

$secretHash = base64_encode(hash_hmac('sha256', $username . $backendAppId, $clientSecret, true));

$cognitoIdp->resendConfirmationCode([
    'ClientId' => $backendAppId,
    'SecretHash' => $secretHash,
    'Username' => $username,
]);

Это дает мне следующую ошибку:

Aws / CognitoIdentityProvider / Исключение / CognitoIdentityProviderException с сообщением «Ошибка выполнения« ResendConfirmationCode »в "https://cognito -idp.eu-central-1.amazonaws.com "; Ошибка AWS HTTP: Ошибка клиента: POST https://cognito-idp.eu-central-1.amazonaws.com в результате 400 Bad Request ответ: {"__type": "NotAuthorizedException", "message": "Невозможно отправить повторно код подтверждения для этого пользователя "} NotAuthorizedException (клиент): Невозможно отправить код подтверждения для этого пользователя - {"__type": "NotAuthorizedException", "message": "Невозможно отправить повторно код подтверждения для этого пользователя "} '

Я использую учетные данные пользователя, который имеет следующие разрешения IAM для пула пользователей:

  • Cognito-IDP: AdminDeleteUser
  • Cognito-IDP: AdminCreateUser
  • Cognito-IDP: AdminAddUserToGroup
  • Cognito-IDP: ResendConfirmationCode

Если я проверяю разрешения с помощью IAM Policy Simulator , он дает зеленый свет, говоря, что все в порядке. Насколько мне известно, действия cognito-idp: ResendConfirmationCode должно быть достаточно, так как отправка подтверждающего электронного письма работает нормально при создании пользователя.

Что я здесь не так делаю? Альтернативным подходом было бы снова вызвать действие AdminCreateUser, установив для параметра MessageAction значение RESEND. Это приведет к повторной отправке подтверждающего электронного письма для существующих пользователей, но я предпочитаю использовать действие ResendConfirmationCode, если смогу заставить его работать.

Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Я понимаю, что вы хотели бы, чтобы конечные пользователи вашего веб-приложения снова получали код подтверждения, если они не получили код подтверждения по какой-либо причине после регистрации, и я также понимаю, что вы получаете "NotAuthorizedException" когда вы пытаетесь запустить вызов API ResendConfirmationCode из своего кода, использующего PHP SDK.

Вызов API ResendConfirmationCode [1] можно использовать после вызова API регистрации [2], и он не является частью потока аутентификации AdminCreateUser, поэтому возникает ошибка. Вызов API AdminCreateUser изменяет статус нового пользователя на «Принудительное изменение состояния пароля», и ни вызов ResendConfirmationCode, ни вызов ForgotPassword не могут работать после того, как AdminCreateUser используется для создания нового пользователя.

Если вы хотите, чтобы ваши конечные пользователи снова получили код подтверждения, вы можете использовать сам вызов API AdminCreateUser и установить флаг «RESEND» в MessageAction в коде PHP. В моем конкретном случае использования не было бы другого способа отправить сообщение с подтверждением, как я понимаю в Amazon Cognito. Пример вызова API в PHP в соответствии с официальной документацией выглядит следующим образом [3]:

$result = $client->adminCreateUser([
    'DesiredDeliveryMediums' => ['<string>', ...],
    'ForceAliasCreation' => true || false,
    'MessageAction' => 'RESEND|SUPPRESS',
    'TemporaryPassword' => '<string>',
    'UserAttributes' => [
        [
            'Name' => '<string>', // REQUIRED
            'Value' => '<string>',
        ],
        // ...
    ],
    'UserPoolId' => '<string>', // REQUIRED
    'Username' => '<string>', // REQUIRED
    'ValidationData' => [
        [
            'Name' => '<string>', // REQUIRED
            'Value' => '<string>',
        ],
        // ...
    ],
]);

После использования параметра «MessageAction» в качестве «RESEND» конечные пользователи должны иметь возможность снова получить сообщение подтверждения на своем конце.

Ссылки

[1]. https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/resend-confirmation-code.html

[2]. https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/sign-up.html

[3]. https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-cognito-idp-2016-04-18.html#admincreateuser

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...