AWS Cognito:如何允许用户在未经验证的情况下更改电子邮件地址?

6
我是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,看起来缺少授权。我的问题是:如何修复授权部分?这种方法是否正确地禁用了更新用户电子邮件的电子邮件验证方式?感谢您的帮助。

你的函数名是 autoValidationUserEmailModification 吗? - hoangdv
@hoangdv 是的,没错。 - matteoh
我刚刚创建了一个答案。 - hoangdv
1个回答

11

允许您的函数在Cognito池资源上执行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。


谢谢你的帮助,现在它可以工作了!话虽如此,它仍然通过电子邮件发送验证码,有没有办法可以禁用它? - matteoh
到目前为止,我发现防止Cognito发送电子邮件的唯一方法是在结尾处抛出异常(但这不是一个非常干净的解决方案...)。有更好的方法吗? - matteoh
1
@thenaoh 你可以尝试每次更新每个属性。首先,更新用户的电子邮件,然后更新email_verified属性,最后完成lambda函数。 - hoangdv
我不太确定我理解你的意思。无论如何,我刚刚在这里发布了一个新问题供您参考:https://dev59.com/w7Xna4cB1Zd3GeqPFBk2 - matteoh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接