当由于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);
}
用户库中的globalsignout代码:
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,并使用可以在其他服务上正常工作的相同格式,并在代码执行继续之前等待结果的promise。
非常感谢所有建议
答案 0 :(得分:0)
如果其他人发现此问题,请从AWS支持更新此行为。我可以确认,在全局退出后,在对用户重新进行身份验证之前添加一小段延迟就可以了。
感谢您再次与我们联系。
为了解决此问题,我尝试通过测试以下提到的流程(由您在中提供)来复制它:
验证用户->全局注销->重新验证->检查新令牌的有效性
我编写了python代码来实现上述流程。在流程中,在调用globalSignOut方法之后,我再次对用户进行身份验证,并通过调用getUser API来检查令牌的有效性。但是,getUser API调用返回了以下响应:“调用GetUser操作时发生错误(NotAuthorizedException):访问令牌已被撤销”
现在,我在GlobalSignOut 1秒钟后添加了睡眠功能,并且流程正常运行。我对睡眠时间进行了一些测试,发现如果添加0.6秒或更长的睡眠时间,则API可以正常工作。因此,似乎GlobalSignOut API调用立即返回了响应,但是全局注销过程(撤销令牌)仍在后端运行约0.6秒。
为此,我与Cognito开发团队联系,以确认GlobalSignOut API调用的这种行为。小组已确认这是GlobalSignOut API调用的预期行为。调用GlobalSignOut之前,所有在此之前发行的令牌都被视为无效。如果注销和身份验证之间的间隔很小(根据我的测试,这大约是0.6秒),那么可以将身份验证后的令牌发行视为在注销呼叫之前发出,并且出于更好的安全性考虑。
我希望以上信息对您有所帮助。如果还有其他可以帮助的事情,请告诉我。我很乐意为您提供帮助。
祝您有美好的一天。
最诚挚的问候,
Amazon Web Services