adminuserglobalsignout不返回任何数据或不等待诺言

时间:2019-06-05 22:22:18

标签: javascript aws-lambda aws-sdk amazon-cognito

当由于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。

非常感谢所有建议

1 个答案:

答案 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