AWS通过Cognito管理用户

时间:2018-11-16 10:14:37

标签: javascript node.js amazon-web-services aws-sdk amazon-cognito

我使用了许多来自AWS的服务,其中一些很简单,而有些则有些困难。经过两天的搜索,我可以说该服务的文档具有误导性。

我有简单的任务要做。我想更改Cognito池中的用户属性。为了使事情变得简单,我只需要更改一封电子邮件即可。应用程序是后台办公室(Express / Node),管理员可以在其中更改用户的电子邮件。

阅读后,我变得更加困惑。显然,我熟悉的aws-sdk库具有一些我可以使用的Cognito API。获得有关如何使用它们的有效示例,事实证明是一场噩梦。 然后我发现这里有一个library,但是只能在客户端使用。经过一些调整后,我在Node.js中运行了它。调整是在全局Node.js命名空间中公开fetch库。

我能够添加一个新用户。但是出于我的所有意图,我无法更改任何属性(例如电子邮件)。图书馆要我提供用户名(真实用户)和密码。 我确实有一个用户名(在本例中为电子邮件),但是我没有密码。

我需要做的就是连接到服务,并为用户发送新属性,仅此而已。 到目前为止,这是我所拥有的(主要是来自各个地方的被入侵的代码示例),但我无法使其正常工作:

var poolData = {
    UserPoolId : 'euXXXXXXX',
    ClientId : 'XXXXXXXXXXXX'
};
var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

确定上面的行建立了与现有用户池的连接。

现在,如果我要这样做:

var attributeList = [];

var dataEmail = {
    Name : 'email',
    Value : 'email@mydomain.com'
};

var dataPhoneNumber = {
    Name : 'phone_number',
    Value : '+15555555555'
};

var attributeEmail = new AmazonCognitoIdentity.CognitoUserAttribute(dataEmail);
var attributePhoneNumber = new AmazonCognitoIdentity.CognitoUserAttribute(dataPhoneNumber);

attributeList.push(attributeEmail);
attributeList.push(attributePhoneNumber);

userPool.signUp('username', 'password', attributeList, null, function(err, result){
    if (err) {
        alert(err.message || JSON.stringify(err));
        return;
    }
    cognitoUser = result.user;
    console.log('user name is ' + cognitoUser.getUsername());
});

我可以在AWS控制台中看到正在添加用户。很好。

现在如何更改现有用户的属性? 所有示例,例如thisthis 建议以下内容:

  

用例8.更新已认证用户的用户属性。

var attributeList = [];
var attribute = {
    Name : 'nickname',
    Value : 'joe'
};
var attribute = new AmazonCognitoIdentity.CognitoUserAttribute(attribute);
attributeList.push(attribute);

cognitoUser.updateAttributes(attributeList, function(err, result) {
    if (err) {
        alert(err.message || JSON.stringify(err));
        return;
    }
    console.log('call result: ' + result);
});

这里的问题是我无法验证用户身份。我不知道用户的密码,只有他的电子邮件。毕竟,这是一个简单的Backoffice程序,我只需要在其中更改用户电子邮件即可。

在这种情况下我该怎么办?

1 个答案:

答案 0 :(得分:3)

要以管理员身份更新Cognito用户池用户的属性,应使用aws-sdkCognitoIdentityServiceProvider中的adminUpdateUserAttributes函数。

let AWS = require('aws-sdk');
let cognitoISP = new AWS.CognitoIdentityServiceProvider({ region: 'your-region-here' });

function updateUserAttribute(name, value, username, userPoolId){
    return new Promise((resolve, reject) => {
        let params = {
            UserAttributes: [
                {
                    Name: name,     // name of attribute
                    Value: value    // the new attribute value
                }
            ],
            UserPoolId: userPoolId,
            Username: username
        };

        cognitoISP.adminUpdateUserAttributes(params, (err, data) => err ? reject(err) : resolve(data));
    });
}