【发布时间】:2017-09-15 06:04:37
【问题描述】:
我想通过他们的子用户在我的 Cognito 用户池中查找用户,据我所知,这只是他们的 UUID。我想在 Lambda 函数中用 Java 执行此操作,但在 AWS 的文档中找不到如何执行此操作。有什么想法吗?
【问题讨论】:
标签: java amazon-web-services amazon-cognito
我想通过他们的子用户在我的 Cognito 用户池中查找用户,据我所知,这只是他们的 UUID。我想在 Lambda 函数中用 Java 执行此操作,但在 AWS 的文档中找不到如何执行此操作。有什么想法吗?
【问题讨论】:
标签: java amazon-web-services amazon-cognito
// class var
protected final AWSCognitoIdentityProviderClient identityUserPoolProviderClient;
// initialize the Cognito Provider client. This is used to talk to the user pool
identityUserPoolProviderClient = new AWSCognitoIdentityProviderClient(new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY));
identityUserPoolProviderClient.setRegion(RegionUtils.getRegion(USER_POOL_REGION));
// ...some init code omitted
// build the request
AdminGetUserRequest idRequest = new AdminGetUserRequest();
idRequest.withUserPoolId(USER_POOL_ID);
idRequest.withUsername(username);
// call cognito for the result
AdminGetUserResult result = identityUserPoolProviderClient.adminGetUser(idRequest);
// loop through results
List<UserType> userTypeList = result.getUsers();
// loop through them
for (UserType userType : userTypeList) {
List<AttributeType> attributeList = userType.getAttributes();
for (AttributeType attribute : attributeList) {
String attName = attribute.getName();
String attValue = attribute.getValue();
System.out.println(attName + ": " + attValue);
}
}
【讨论】:
截至今天,这对于 Cognito 用户池来说是不可能的。
只能使用用户名或别名查找用户。 ListUsers API 还允许通过在某些 standard attributes 上提供搜索过滤器来搜索用户,但 sub 不是其中之一。
【讨论】:
现在可以了。 http://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html
“sub”在支持的属性列表中。 JavaScript 示例:
var cog = new AWS.CognitoIdentityServiceProvider();
var filter = "sub = \"" + userSub + "\"";
var req = {
"Filter": filter,
"UserPoolId": "your pool id" // looks like us-east-9_KDFn1cvys
};
cog.listUsers(req, function(err, data) {
if (err) {
console.log(err);
}
else {
if (data.Users.length === 1){ //as far as we search by sub, should be only one user.
var user = data.Users[0];
var attributes = data.Users[0].Attributes;
} else {
console.log("Something wrong.");
}
}
});
【讨论】:
老问题,但是您的 username 参数在 Cognito 的 adminGetUser 方法中被重载。不幸的是,它没有记录在案:adminGetUser SDK
这是一个sn-p:
const params = {
UserPoolId: 'someUserPoolId'
Username: 'random-string-sub-uuid',
};
CognitoService.adminGetUser(params,(err, data) => {
console.log(data);
})
Returns:
{ Username: 'random-string-sub-uuid',
UserAttributes:
[ { Name: 'sub', Value: 'random-string-sub-uuid' },
{ Name: 'custom:attributeName', Value: 'someValue' },
{ Name: 'email_verified', Value: 'false' },
{ Name: 'name', Value: 'nameValue' },
{ Name: 'email', Value: 'user@stackoverflow.com' } ],
UserCreateDate: 2018-10-12T14:04:04.357Z,
UserLastModifiedDate: 2018-10-12T14:05:03.843Z,
Enabled: true,
UserStatus: 'CONFIRMED' }
【讨论】:
aws CLI
Username 而不是sub。
AdminGetUser 似乎也不起作用。我们依靠sub 工作,因为我们要求用户名是电子邮件。这是有效的,因为就像@hvaughan3 说它适用于该池配置。但是,一旦我们设置了 IDP 并让用户进行配置,它就不适用于这些用户。必须切换到ListUsers,并在sub 上使用过滤器。