我正在学习AWS,所以如果这是一个明显的问题,请原谅我。我的目标是使用API Gateway中的Cognito Authorizer对我的用户进行身份验证。这部分很好。我可以将令牌发送到前端并返回到api。我现在要做的是从用户池中提取一些用户属性,这样我就可以把它们放在Dynamo的一些非规范化字段中。似乎最好的方法是在帖子上拉用户属性(如果有更好的方法,请随意回答),这需要cognitoidentityserviceprovider.listUsers
。问题是回调永远不会执行。起初我没有得到授权的错误,所以我更新了IAM策略,这就消失了,现在我得到回调之外的日志,但不是在里面。
let cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});
let sub = event.requestContext.authorizer.claims.sub;
let userpool = event.stageVariables.userpool;
const cogParams = {
UserPoolId: userpool,
Filter: "sub=""+ sub + """,
Limit: 1
};
console.log('listing',JSON.stringify(cogParams));
cognitoidentityserviceprovider.listUsers(cogParams, function(err, data) {
console.info('entered callback');
if (err) {
console.log(err, err.stack); }
else {
console.log('data',data);
}
console.info('end callback');
});
console.log('listed');
预期输出
listing {...}
entered callback
data {...}
end callback
listed
实际输出
listing {...}
listed
从await
的使用情况来看,您似乎正在使用异步处理程序。此外,根据AWS关于使用async/await的文档,注意到接受回调的函数不会返回承诺,您必须将它们与.promise()
方法链接:
因此,为了使大多数接受回调的函数都不返回promise。因为你只使用返回承诺的
await
函数,要使用async/await
模式,你需要将.promise()
方法链接到调用的末尾,并删除回调。
await
正确地等待listUsers
执行而不是继续前进,您应该将代码更新为:
异步处理程序版本
const AWS = require('aws-sdk');
exports.handler = async (event) => { // <-- async handler
let cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({ apiVersion: '2016-04-18' });
let sub = event.requestContext.authorizer.claims.sub;
let userpool = event.stageVariables.userpool;
const cogParams = {
UserPoolId: userpool,
Filter: "sub="" + sub + """,
Limit: 1
};
console.log('listing', JSON.stringify(cogParams));
// use `await` due to async handler
let userList = await cognitoidentityserviceprovider.listUsers(cogParams, function(err, data) {
console.info('entered callback');
if (err) {
console.log(err, err.stack);
}
else {
console.log('data', data);
}
console.info('end callback');
}).promise(); // <-- added the .promise() for the `await`
console.log('listed', userList); // <-- got the result also on the variable
};
请注意,回调被保留以显示它正在执行,但是,根据AWS文档建议,它可以被删除。
如果你更喜欢回调编程模型:
非异步处理程序版本
const AWS = require('aws-sdk');
exports.handler = (event) => { // <-- no `async` keyword
let cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({ apiVersion: '2016-04-18' });
let sub = event.requestContext.authorizer.claims.sub;
let userpool = event.stageVariables.userpool;
const cogParams = {
UserPoolId: userpool,
Filter: "sub="" + sub + """,
Limit: 1
};
console.log('listing', JSON.stringify(cogParams));
cognitoidentityserviceprovider.listUsers(cogParams, function(err, data) {
console.info('entered callback');
if (err) {
console.log(err, err.stack);
}
else {
console.log('data', data);
}
console.info('end callback');
});
console.log('listed');
};
关于使用认知身份服务提供者。方法,使用cognitoidentityserviceprovider可能更正确一些。adminGetUser,因为您也应该有权访问用户名,并且您总是检索单个用户。