AWS API Gateway返回403,其中包含x-amzn-ErrorType:AccessDeniedException标头

时间:2016-12-12 12:22:25

标签: amazon-web-services

上下文

我有一个使用AWS trio构建的无服务器Web应用程序:API Gateway + Lambda + DynamoDB。 应用程序的第一页发送2个http请求以获取数据并组合响应以打印结果。

            / APIGateway /projects      => Lambda (DynamoDB request)   \
web app => {                                                            } => display data
            \ APIGateway /organizations => Lambda (Github API request) /

问题

我第一次要求页面时,每次都很顺利。但是,如果我尝试刷新此页面,则会在403请求中收到/organizations错误。从那里,如果我等待~3-5分钟,我再次刷新页面,我正确地看到所有数据,我的页面完美显示。有时,GET /organizations失败,有时候,它是GET /projects

为什么我必须等待才能正确刷新页面?我该如何解决?

其他信息

当我遇到403错误时,...

  • 我收到了对200 OK请求
  • OPTIONS /organizations响应
  • 我在Cloudwatch日志中根本没有看到GET /organizations请求(OPTIONS请求在那里,但GET没有)
  • 响应标头是:

    Connection:keep-alive
    Content-Length:60
    Content-Type:application/json
    Date:Mon, 12 Dec 2016 11:31:29 GMT
    Via:1.1 af2dd53407c5eae7ddf5c44e27a5dd1b.cloudfront.net (CloudFront)
    X-Amz-Cf-Id:Kl1JS1ZCCJuGAmydXv3qDoq3E-rFZrlZbs8Bgvw8RSrb8xsjEyAJNQ==
    x-amzn-ErrorType:AccessDeniedException
    x-amzn-RequestId:8689b86c-c05e-11e6-b851-7ff70d9a3125
    X-Cache:Error from cloudfront
    

    (我不知道为什么我有x-amzn-ErrorType:AccessDeniedExceptionX-Cache:Error from cloudfront

  • 我的Chrome控制台出现了CORS错误:

    XMLHttpRequest cannot load https://********.execute-api.eu-central-1.amazonaws.com/prod/organizations. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 403.
    

    (...即使启用了CORS且Access-Control-Allow-Origin:*响应标头中存在OPTIONS

感谢您的帮助!

2 个答案:

答案 0 :(得分:7)

此问题的根源是自定义授权程序,它为特定资源生成自定义策略。当缓存此策略时,当第二个请求到达时,它与先前生成的请求不匹配并返回错误。

解决方法:禁用缓存

  • 在API网关服务上打开AWS控制台,
  • 点击您的API,
  • 在左侧窗格中选择授权人,然后选择您的自定义授权程序

以秒为单位的结果TTL 中,键入 0 ,然后点击更新。现在,您必须部署API以发布更改:

  • 点击左侧窗格中的资源菜单,然后在操作下拉菜单中,点击部署API
  • 选择舞台,然后点击部署

解决方案:改进您的政策

def generatePolicy(principalId, context):
  return {
    'principalId': principalId,
    'policyDocument': {
        'Version': '2012-10-17',
        'Statement': [{
            'Action': 'execute-api:Invoke',
            'Effect': 'Allow',
            'Resource': 'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/*'
        }]
    },
    'context': context
  }

使用数组

>可以在资源属性中更精确
'Resource': [
  'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/GET/projects',
  'arn:aws:execute-api:eu-central-1:123456789012:abcdefghij/prod/GET/user',
  ...
]

您可以允许资源的超集和拒绝特定的超集。

  

查看@Jeremiah的链接:https://forums.aws.amazon.com/thread.jspa?threadID=225934&tstart=0

答案 1 :(得分:1)

因此,自定义授权程序中的策略似乎是针对非常特定的资源生成的。该主题解释了它 - https://forums.aws.amazon.com/thread.jspa?threadID=225934&tstart=0