我有一个AWS Cognito用户池,使用AdminCreateUser操作通过Cognito的API创建用户,效果很好。这会向用户发送一封包含临时密码的验证电子邮件。到目前为止一切顺利。
现在,用户没有收到此验证电子邮件,因此我需要使用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 / Exception / 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”,“消息”:“无法重新发送 此用户的确认代码“} NotAuthorizedException(客户端): 无法重新发送该用户的确认码- {“ __type”:“ NotAuthorizedException”,“消息”:“无法重新发送 该用户的确认码“}'
我正在使用对用户池具有以下IAM权限的用户的凭据:
如果我使用IAM Policy Simulator测试权限,则表示绿灯,表示一切正常。据我所知, cognito-idp:ResendConfirmationCode 操作应该足够了,因为在创建用户时发送验证电子邮件会很好。
我在这里做错了什么?另一种方法是再次调用AdminCreateUser操作,将MessageAction
参数设置为RESEND
。这将迫使验证电子邮件重新发送给现有用户,但是如果可以使用,我更喜欢使用ResendConfirmationCode操作。
有什么想法吗?谢谢!
答案 0 :(得分:1)
我了解您希望您的Web应用程序最终用户在注册后由于某种原因而没有收到确认码,他们希望再次收到确认码,并且我也了解您将收到“ NotAuthorizedException”当您尝试从使用PHP SDK的代码中运行ResendConfirmationCode API调用时。
ResendConfirmationCode API调用[1]可以在注册API调用[2]之后使用,它不是AdminCreateUser身份验证流程的一部分,这就是引发错误的原因。 AdminCreateUser API调用将新用户的状态更改为“强制更改密码状态”,并且在使用AdminCreateUser创建新用户后,ResendConfirmationCode调用或ForgotPassword调用均无法正常工作。
如果希望最终用户再次获取确认代码,则可以使用AdminCreateUser API调用本身,并在PHP代码的MessageAction中设置“ RESEND”标志。根据我对Amazon Cognito的了解,在此特定用例中,将没有其他方法可以再次发送验证消息。 根据官方文档,PHP中的API调用示例如下[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