【问题标题】:Unable to restrict access to AWS API even after calling globalsignout Method using javascript即使在使用 javascript 调用 globalsignout 方法后也无法限制对 AWS API 的访问
【发布时间】:2019-04-13 01:05:43
【问题描述】:

我将 AWS API 网关用于 API 和 cognito UserPool 用于安全性。在对用户进行身份验证后,我们将获得令牌,并且我正在使用该令牌来授权我的 API。

现在,我正在尝试使用 javascript 启用对 cognito 授权用户的注销。使用下面的代码。

if (cognitoUser != null) {
          cognitoUser.globalSignOut({   
                           onFailure: e =>   console.log(e), 
                           onSuccess: r =>   
               console.log('Logout success: ' + r)  
})} 

我收到了成功的响应,但我仍然可以使用以前的令牌访问我的 API。请建议我如何停用所有发给该认知用户的令牌。

【问题讨论】:

    标签: javascript amazon-web-services aws-api-gateway amazon-cognito


    【解决方案1】:

    API 网关用来验证 API 调用的 id 令牌保持有效一段时间。

    我会测试访问令牌。它应该在您调用全局注销后立即过期。

    关键词是上面的应该。请参阅this issue。让 AWS 实施立即撤销是一项持续的斗争。这是一个相关的报价:

    我与 AWS Cognito 团队合作解决了这个问题,并通过 CLI 发布了修复程序,如下所示。

    aws cognito-identity update-identity-pool --identity-pool-id --identity-pool-name --allow-unauthenticated-identities --cognito-identity-providers ProviderName=,ClientId=,ServerSideTokenCheck=<true|false>
    

    通过在 Cognito 身份上将 ServerSideTokenCheck 设置为 true 池,该身份池将与 Cognito 用户池核对以生成 确保用户之前没有被全局注销或删除 身份池为 用户。现在我们遇到了这个 Token 被缓存的另一个问题 在 API Gateway 中停留 10 分钟,这将使该 OID 令牌仍然存在 即使用户已全局退出,也活动 10 分钟。

    这就是我所说的 accessToken 测试的意思(我已经使用方法 #2 取得了成功):

    1.) 你可以开发一个custom authorizer for API Gateway

    2.) 您可以在 lambda 函数的开头或在您的服务器上执行检查,使用:

    const AWS = require('aws-sdk');
    const awsConfig = require('./awsConfig');
    
    const cognito = new AWS.CognitoIdentityServiceProvider(awsConfig);
    
    // accessToken provided from API Gateway
    
    new Promise((resolve, reject) => {
      cognito.getUser({ accessToken }, (errorCallback, response) => {
        if (errorCallback) {
          reject(errorCallback);
        } else {
          resolve(response);
        }
      });
    });
    

    errorCallback 和 response 无关紧要。如果出现错误,则令牌无效。如果你不这样做,它是有效的。

    【讨论】:

    • 感谢您的回复。我在 api 网关中更改了我的配置。所以,现在我可以使用 AccessToken 而不是 Id Token 访问 API。现在,我调用了 globalsignout 方法。之后,我使用之前的 accesstoken 进行了测试以验证我的 API。我的令牌仍然没有过期。请让我知道我做错了什么。
    • 我在一个项目中使用了上面的方法#2,它已经奏效了。我对方法 #1 的实现不太熟悉。作为测试,如果可能的话,我会看看方法 #2 是否适用于 Lambda 函数或您的服务器。如果是这样,我会改变我的答案。我会得到方法#2。存在访问令牌撤销延迟的已知问题。我将在上面的答案中发布。
    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2016-06-07
    • 2017-09-20
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多