Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript adminuserglobalsignout未返回任何数据或未等待承诺_Javascript_Aws Lambda_Aws Sdk_Amazon Cognito - Fatal编程技术网

Javascript adminuserglobalsignout未返回任何数据或未等待承诺

Javascript adminuserglobalsignout未返回任何数据或未等待承诺,javascript,aws-lambda,aws-sdk,amazon-cognito,Javascript,Aws Lambda,Aws Sdk,Amazon Cognito,当由于adminuserglobalsignout而等待承诺时,承诺似乎会返回,但数据不包含任何内容 注销后的下一个调用是对用户进行身份验证。返回了正确的accessToken,但它已被撤销,这使我认为承诺没有正确等待,并且新凭据正在被仍在运行的上一个调用注销 我们使用globalsignout来防止用户有多个会话,因此工作流是按照 验证->成功->注销(终止任何其他会话)->验证->成功->返回令牌 我已经更新了我的lambda包,包括最新的SDK版本2.469.0,没有任何改进 有时,由于返

当由于adminuserglobalsignout而等待承诺时,承诺似乎会返回,但数据不包含任何内容

注销后的下一个调用是对用户进行身份验证。返回了正确的accessToken,但它已被撤销,这使我认为承诺没有正确等待,并且新凭据正在被仍在运行的上一个调用注销

我们使用globalsignout来防止用户有多个会话,因此工作流是按照

验证->成功->注销(终止任何其他会话)->验证->成功->返回令牌

我已经更新了我的lambda包,包括最新的SDK版本2.469.0,没有任何改进

有时,由于返回的凭据仍然有效并且可以使用令牌,因此计时必须正常

在这两种情况下,AWS调用返回的数据似乎都为零

调用用户库中的signout方法的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);
有人看到可能导致这种情况的任何问题吗?我尝试了几种方法来指定承诺,并使用了同样的格式,这种格式可以很好地用于其他服务,并在代码继续执行之前等待结果的承诺


非常感谢AWS支持部门提供的有关此行为的所有建议,以防其他人发现此问题。我可以确认,在全局注销之后,在重新验证用户之前添加一个小延迟可以正常工作

谢谢你回复我们

为了解决这个问题,我尝试通过测试下面提到的流(由您在中提供)在我的端复制它:

验证用户->全局注销->再次验证-->检查新令牌的有效性

我编写了一个python代码来实现上述流程。在流中,在调用globalSignOut方法之后,我再次对用户进行身份验证,并通过调用getUser API检查令牌的有效性。但是,getUser API调用返回以下响应:“调用getUser操作时发生错误(NotAuthorizedException):访问令牌已被吊销”

现在,我在GlobalSignOut后添加了sleep函数1秒钟,流程正常运行。我对睡眠时间做了一些测试,并注意到如果我们增加0.6秒或更长的睡眠时间,API就能正常工作。因此,GlobalSignOut API调用似乎立即返回响应,但全局注销过程(撤销令牌)仍在后端运行约0.6秒

为此,我联系了Cognito开发团队,以确认GlobalSignOut API调用的这种行为。团队已经确认这是GlobalSignOut API调用的预期行为。调用GlobalSignOut时,在此之前发出的所有令牌都被视为无效。如果签出和身份验证之间的差距非常小(根据我的测试,这大约是0.6秒),则身份验证后的令牌问题可以被视为在签出调用之前发出,并且为了更好的安全性,被视为无效

我希望以上信息能有所帮助。如果还有什么我能帮忙的,请告诉我。我将非常乐意帮助你

祝你有美好的一天

致以最良好的祝愿

亚马逊网络服务


肮脏的黑客警告。在解析承诺之前添加了一个sleep函数,请注意,收到的每一组令牌都是有效的。AWS方法如何尽早返回到我的代码中,或者我认为我正确地等待AWS的预期承诺,这一定是出了什么问题。