我的应用程序是使用2个服务进行身份验证的过程,其中一项是AWS Cognito。当用户通过身份验证(Cognito提供了JWT令牌)后,我尝试通过tsconfig.json
API调用列出该用户的组。我收到了 UserNotFoundException ,这很奇怪,因为先前的调用刚刚使用相同的凭据对该用户进行了身份验证?
我做了以下实验:
AdminListGroupsForUser
router.post("/groups/list", (req, res, next) => {
const { email, limit, nextToken } = req.body;
const listGroupsForUserParams = getAdminListGroupsForUserParams({
email,
limit,
nextToken
});
const getUserParams = getAdminGetUserParams(email);
cognitoClient.adminListGroupsForUser(listGroupsForUserParams, (listErr, listData) => {
cognitoClient.adminGetUser(getUserParams, (getErr, getData) => {
console.log(listErr); // "UserNotFoundException"
console.log(listData); // null
console.log(getErr); // null
console.log(getData); // User
});
});
});
和listGroupsForUserParams
包含以下相同信息:
getUserParams
我不知道前者在池中找不到用户,而后者可以在池中找到用户,这有什么意义呢?
请参见(以供参考):
答案 0 :(得分:0)
我遇到了同样的问题,由于某种原因,adminListGroupsForUser
函数不接受电子邮件作为用户名,而adminGetUser
接受。
我通过使用adminGetUser
检索用户数据来解决此问题。它返回用户及其所有属性。检索名称为sub
的属性值,并将其用作adminListGroupsForUser
调用的用户名。
类似这样的东西:
const getParams = {
UserPoolId: "" /*put your user pool Id here*/,
Username: "" /* email */
};
cognitoidentityserviceprovider.adminGetUser(getParams, function(err, data) {
if (err) {
console.log(err, err.stack); // an error occurred
return;
}
var sub;
if (data.UserAttributes && data.UserAttributes.length) {
for (var i = 0; i < data.UserAttributes.length; ++i) {
const attr = data.UserAttributes[i];
if (attr.Name === 'sub') {
console.log(attr);
sub = attr.Value
break;
}
}
}
if (!sub)
return;
const groupsParams = {
UserPoolId: event.userPoolId,
Username: sub
};
cognitoidentityserviceprovider.adminListGroupsForUser(groupsParams, function(err, data) {
/* Your code using groups here */
});
});