【发布时间】:2019-10-21 10:55:29
【问题描述】:
当由于 adminuserglobalsignout 等待承诺时,承诺似乎返回,但数据不包含任何内容。
注销后的下一个调用是对用户进行身份验证。返回了正确的 accessToken 但它已经被撤销了,这让我认为承诺没有正确等待,并且新凭据正在被仍在运行的前一个调用注销。
我们正在使用 globalsignout 来防止用户拥有多个会话,因此工作流程遵循以下原则
验证 -> 成功 -> 注销(终止任何其他会话)-> 验证 -> 成功 -> 返回令牌
我已更新我的 lambda 包以包含最新的 SDK 版本 2.469.0,但没有任何改进。
有时时间必须没问题,因为返回的凭据仍然有效并且可以使用令牌。
在这两种情况下,AWS 调用返回的数据似乎为零
调用用户库中的注销方法的 lambda 代码部分
try {
signOutResult = await User.globalSignOut(userId, process.env.COGNITO_POOL);
} catch (err) {
log.error("AWS Global Signout Error: " + JSON.stringify(err));
responseBody = Helper.buildCORSResponse(502, JSON.stringify({ message: err }));
return callback(null, responseBody);
}
用户库中的全局注销代码:
return new Promise((resolve, reject) => {
log.info(`globalSignOut: Signing ${Username} out from all devices in pool ${UserPoolId}`);
const signOutRequest = new AWS.CognitoIdentityServiceProvider({ apiVersion: "2016-04-18" }).adminUserGlobalSignOut({ Username, UserPoolId });
const signOutPromise = signOutRequest.promise();
signOutPromise.
then((data) => {
log.debug("globalSignOut: Cognito SignOut Success: " + JSON.stringify(data));
resolve(data);
}).catch((err) => {
log.error("globalSignOut: Cognito SignOut Error: " + err);
reject(err);
});
});
}
在每次调用中,我们都会毫无问题地解决问题,然后我们会再次对用户进行身份验证。
log.debug("globalSignOut: Cognito SignOut Success: " + JSON.stringify(data));
resolve(data);
有没有人发现任何可能导致这种情况的问题?我尝试了几种方法来指定承诺,并使用适用于其他服务的相同格式并在代码执行继续之前等待结果的承诺。
非常感谢所有建议
【问题讨论】:
-
脏黑客警告。在解决 promise 之前添加了一个 sleep 函数,你会发现收到的每组令牌都是有效的。必须与 AWS 方法如何提前返回我的代码有关,或者我相信我正在正确地等待 AWS 的预期承诺。
标签: javascript aws-lambda aws-sdk amazon-cognito