AWS API Gateway自定义Authorizer奇怪显示错误

时间:2018-05-14 13:30:46

标签: aws-api-gateway custom-authentication

以下是上下文:

  • 我在API网关中设置了一个资源。 /用户/公司
  • 此资源有2种方法。获取和发布。
  • 我为此资源配置了自定义授权程序。

问题:

  • 我可以通过发送正确的授权信息来调用GET方法,并按预期得到结果。
  • 我尝试发送POST请求,但收到以下错误:



{
  "message": "User is not authorized to access this resource"
}




  • 如果我等待几分钟,然后调用POST方法,它将起作用。
  • 如果在调用POST方法并获得结果后我调用GET方法,它将显示与上述相同的错误。

此外,我已为授权人禁用了缓存。

enter image description here

可能导致此问题的原因是什么?

5 个答案:

答案 0 :(得分:10)

这可以通过越野车的答案中描述的两个选项来解决:https://forum.serverless.com/t/rest-api-with-custom-authorizer-how-are-you-dealing-with-authorization-and-policy-cache/3310

简短版本:

  1. 将客户授权者的TTL设置为0
  2. 将自定义授权者策略资源设置为“ *”

尝试了两种解决方案,他们为我解决了“用户无权访问此资源”的问题。

答案 1 :(得分:1)

在您的自定义策略构建代码使用中,节点js模块aws-auth-policy 您可以使用的Nodejs部分,

AuthPolicy.prototype.allowAllMethods = function () {
  addMethod.call(this, "allow", "*", "*", null);
}

在代码中

const AuthPolicy = require('aws-auth-policy');
  const policy = new AuthPolicy(principalId, awsAccountId, apiOptions);
           // policy.allowMethod(method, resource);
            policy.allowAllMethods();
            const authResponse = policy.build();

答案 2 :(得分:0)

如果您将event.methodArn用作生成策略的资源,并在不同功能之间共享授权者,则将发生此错误,因为策略缓存的工作方式。对于提供的令牌,它将在整个API中缓存策略,对于同一API和阶段(如果它们共享相同的授权者)中的所有方法和资源,它将是相同的缓存条目。

例如,当向GET /users发出请求时,ARN看起来像这样:

arn:aws:execute-api:us-1:abc:123/prod/GET/users

对具有相同身份验证令牌的任何终结点的下一次调用将使用在第一次调用GET /users时创建的缓存策略。该缓存策略的问题在于它的资源仅允许单个特定资源arn: ... /prod/GET/users,其他任何资源都将被拒绝。

根据要限制策略权限的数量,可以在创建策略时提及所有可能的资源

{
  "principalId": "user",
  "policyDocument": {
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": [
          "arn:aws:execute-api:us-1:abc:123/prod/GET/v1/users",
          "arn:aws:execute-api:us-1:abc:123/prod/POST/v1/users",
          "arn:aws:execute-api:us-1:abc:123/prod/GET/v1/orders"
        ]
      }
    ],
    "Version": "2012-10-17"
  }
}

或使用wildcards

"Resource": "arn:aws:execute-api:us-1:abc:123/prod/*/v?/*"

甚至

"Resource": "*"

您可以将policy variables用于某些高级模板。

通过允许使用通配符的所有内容,然后在另一条策略声明中拒绝特定资源,也可以使用黑名单方法。

来源:

答案 3 :(得分:0)

我通过将AuthorizerResultTtlInSeconds设置为0来解决此问题。

原因是我使用的是共享授权者。但是,授权者通过读取请求的事件上下文并授予IAM来调用特定的lambda来进行工作。

因为共享了授权者,所以它正在缓存响应,该响应是针对特定lambda的IAM,对于TTL(在我的情况下)为300秒。

因此,我可以一分钟调用一个API,而不是下一分钟。

将上述值更改为0可以解决此问题。

答案 4 :(得分:0)

我面临着同样的“用户无权访问此资源”的错误,因为我没有在api网关的授权者中提供OAuth范围