AWS 通过 Cognito 管理用户
AWS managing users via Cognito
我用过很多AWS的服务,有的简单,有的难。经过 2 天的到处搜索,我可以说此服务的文档具有误导性。
我有简单的任务要做。我想更改 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 控制台中看到正在添加用户。太好了。
现在如何更改现有用户的属性?
所有的例子都像 this and this
建议如下:
Use case 8. Update user attributes for an authenticated user.
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);
});
这里的问题是我无法验证用户。我不知道用户的密码,只能知道他的电子邮件。这毕竟是一个简单的后台程序,我只需要更改用户的电子邮件即可。
遇到这种情况我该怎么办?
要以管理员身份更新 Cognito 用户池用户的属性,您应该使用 aws-sdk
class CognitoIdentityServiceProvider
.[=14 中的 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));
});
}
我用过很多AWS的服务,有的简单,有的难。经过 2 天的到处搜索,我可以说此服务的文档具有误导性。
我有简单的任务要做。我想更改 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 控制台中看到正在添加用户。太好了。
现在如何更改现有用户的属性? 所有的例子都像 this and this 建议如下:
Use case 8. Update user attributes for an authenticated user.
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);
});
这里的问题是我无法验证用户。我不知道用户的密码,只能知道他的电子邮件。这毕竟是一个简单的后台程序,我只需要更改用户的电子邮件即可。
遇到这种情况我该怎么办?
要以管理员身份更新 Cognito 用户池用户的属性,您应该使用 aws-sdk
class CognitoIdentityServiceProvider
.[=14 中的 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));
});
}