AWS Cognito:如何允许用户无需验证即可更改电子邮件?

时间:2019-07-14 08:29:01

标签: amazon-web-services amazon-cognito

我是AWS的新手,我正在寻找一种方法,允许我的Android应用程序的用户无需进行验证即可更改我的电子邮件(我成功进行了订阅)。

我尝试关注thisthis,这就是我所做的。

在我的Android应用中:

public void onClickChangeEmail(View view)
{
    CognitoUserAttributes attributes = new CognitoUserAttributes();
    attributes.getAttributes().put("email", "second@mail.com");
    CognitoSettings
            .getCognitoUserPool(MainActivity.this)
            .getCurrentUser()
            .updateAttributesInBackground(attributes, new UpdateAttributesHandler()
    {
        @Override
        public void onSuccess(List<CognitoUserCodeDeliveryDetails> attributesVerificationList)
        {
            Log.i("tag", "Email updated!");
        }

        @Override
        public void onFailure(Exception e)
        {
            e.printStackTrace();
        }
    });
}

然后,在我的AWS控制台中,我在自定义消息的Cognito中添加了一个触发器,这是我的lambda函数,每次用户更新其电子邮件时都会触发该函数:

const AWS = require('aws-sdk')
AWS.config.update({region: 'eu-central-1'});

exports.handler = (event, context, callback) => {
    if (event.triggerSource === 'CustomMessage_UpdateUserAttribute')
    {
        const params = {
            UserAttributes: [
              {
                  Name: 'email_verified',
                  Value: 'true',
              },
            ],
            UserPoolId: event.userPoolId,
            Username: event.userName,
        };
        var cognitoIdServiceProvider = new AWS.CognitoIdentityServiceProvider();
        cognitoIdServiceProvider.adminUpdateUserAttributes(params, function(err, data) {
            if (err) context.done(err, event); // an error occurred
            else context.done(null, event); // successful response
        });
    }
    else
    {
        context.done(null, event);
    }
};

结果是:电子邮件已正确更新(但在没有lambda的情况下仍然有效),但是lambda崩溃了,并出现以下错误:

autoValidationUserEmailModification is not authorized to perform: cognito-idp:AdminUpdateUserAttributes

因此,似乎缺少授权。

我的问题是:

  • 如何修复授权部分?
  • 该方法是否是在更新用户电子邮件时禁用电子邮件验证的正确方法?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

允许您的功能对Cognito Pool资源执行AdminUpdateUserAttributes

使用如下代码块更新Lambda执行规则:

{
    "Action": [
        "cognito-idp:AdminUpdateUserAttributes"
    ],
    "Resource": "arn:aws:cognito-idp:eu-central-1:<your-user-id>:userpool/<your-user-pool>",
    "Effect": "Allow"
}

其中Resource是您的Cognito用户池ARN。