获取消息:来自AWS API网关

时间:2016-12-06 04:52:11

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

[解决] AWS(和StackOverflow)的新手。我正在尝试在AWS上创建一个lambda服务,并通过API网关从外部访问它,无需身份验证或限制。

为了方便起见,我现在将网关设置为模拟。

在API的Get方法中,授权设置为None,API密钥为not required

当我尝试这个时,我得到{"message":"Forbidden"} (如果我将它连接到实际的lambda服务,则相同的消息)。

有关如何使其可访问的任何建议? 感谢

23 个答案:

答案 0 :(得分:47)

如果您设置了需要的API密钥'选项为true,请在下方查看。

  1. 你必须通过' x-api-key' API网关的HTTP标头参数。
  2. 必须创建API密钥。
  3. 此外,您需要在API网关控制台上查看API密钥的使用计划。

答案 1 :(得分:35)

在API网关仪表板上,选择“资源”,单击“操作”,然后选择“部署API”。在首次部署之前,您将获得的唯一响应是assets:install

答案 2 :(得分:16)

如果您使用自定义域名并忘记选择目标登台,则会收到Forbidden消息。

只需转到Custom Domain Names,然后点击您网域下的Edit,然后选择Base Path Mappings下的阶段。

答案 3 :(得分:6)

我有类似的问题,我有以下内容:

  1. 自定义域(边缘优化)
  2. 多个阶段(开发,分期,生产)
  3. 我也没有设置任何授权或限制来简化。

    我能够通过为每个阶段(dev,staging,prod)添加基本路径映射来解决问题。

答案 4 :(得分:4)

如果将必需的“ API”密钥设置为true,则需要将api密钥作为标头传递。

API密钥作为标头字段“ x-api-key”传递。即使在标头中添加此字段后,也可能会出现此问题。在这种情况下,请验证以下几点

  • 您有使用计划吗?如果不需要创建一个。
  • 将您的API与使用计划链接起来。为此,它将链接您的API。
  • 您有API密钥吗?如果不是,则需要创建一个API密钥并启用它。
  • 将与您的API链接的使用计划添加到此API密钥。为此,添加使用计划。

答案 5 :(得分:3)

如果方法的AuthorizationAPI KEY Required都设置为true,请确保在发送请求时有以下标题:

  1. 内容类型(通常是应用程序/ x-www-form-urlencoded,如果GET调用)
  2. HOST
  3. X-AMZ-日期
  4. 授权
  5. 的x API-键
  6. 我使用POSTMAN进行API测试,这是非常可靠的,然后它可以直接进行。

    注意:如果您将API KEY REQUIRED设置为FALSE,请不要添加x-api密钥标头。 如果您将AUTHORIZATION设置为FALSE,则不要添加Authorization标头。

答案 6 :(得分:3)

我遇到的唯一一个我没有看到的其他原因是,从字面上看,您试图在发布后太快地访问API。我点击发布,看到“您的API可以访问”域名,然后立即将其复制并粘贴到Postman中进行检查。

我收到了禁止的消息。不变。检查所有设置以确保我没有做任何事情-一切正确。金达把我的头发扯了。

几分钟后再返回尝试,因为我非常确定我所做的一切都正确-可以。

DNS人。不管互联网有多快-它都不是即时的:)

答案 7 :(得分:2)

这可能远非显而易见,但是使用AWS API Gateway时看到“禁止”错误的另一个原因可能是调用了与任何已部署的API方法都不对应的错误URL。如果您实际上输入了错误的URL(例如,而不是调用https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users(没有阶段)而不是调用dev(注意users前的https://9999xx9x99.execute-api.us-east-1.amazonaws.com/users阶段),则会发生这种情况。 d预期会得到404,但您会得到403。

顺便说一句:在部署到https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users并调用https://9999xx9x99.execute-api.us-east-1.amazonaws.com/user(在这里注意单数名词形式)之后,您也会得到……403,但带有“缺少身份验证令牌”消息!

答案 8 :(得分:1)

本地防火墙/防病毒软件或NGIPS( Cisco Bluecoat )。后者就是我的情况,我什至无法从我的API获取CloudWatch中的日志。它允许我在顶级域名托管网站上运行,但是用403 api子域进行了阻止,而浏览器的“网络开发工具”选项卡中没有任何正文。

答案 9 :(得分:1)

就我而言,那是因为我使用了

<块引用>

Managed-AllViewer

来源请求政策。切换到

<块引用>

Managed-UserAgentRefererHeaders

解决了问题。

我的客户发送了一个 Accept-Encoding 标头,CloudFront 不喜欢它。您可以通过创建“白名单”类型的自定义源请求策略来验证这一点,虽然 Accept-Encoding 可从列表中选择,但您在创建策略时会收到错误:"The parameter Headers contains Accept-Encoding that is not allowed."

不幸的是,我没有找到相关文档。也不知道为什么不允许使用这种不起眼的标题。

答案 10 :(得分:1)

我遇到了类似的问题。原来我在证书管理器中的证书不是在北弗吉尼亚地区 (us-east-1) 创建的,因此我无法将自定义域标记为边缘优化。我不得不选择区域。

当我使用弗吉尼亚北部地区重新导入证书并再次创建自定义域时,但这次使用边缘优化的端点配置,它完美无缺。

答案 11 :(得分:1)

我可能已经找到了解决该问题的方法。 我在MacOS上也遇到了同样的问题。 我试图刷新我的DNS ,然后它起作用了!

在终端上尝试一下:

Mac OS X Yosemite及更高版本

sudo killall -HUP mDNSResponder

Mac OS X Yosemite v10.10至v10.10.3

sudo discoveryutil mdnsflushcache

Mac OS X小牛,山狮和狮子

sudo killall -HUP mDNSResponder

Mac OS X Snow Leopard

sudo dscacheutil -flushcache

答案 12 :(得分:1)

当我们在API网关中收到{message:forbidden}时,有几件事要做:

启用了CORS?

  1. 检查是否在API中启用了CORS(首先,请允许来源'*',以确保我们可以安全地进行测试)
  2. 部署API以确保所有设置均符合预期

已启用API密钥?

  1. 检查是否在API网关中启用了API密钥
  2. 检查是否配置了API密钥。
  3. 检查您的API密钥是否已分配给正确的使用计划,并添加一个API阶段,如果没有该API阶段,您将始终收到{message:forbidden}

如果您仍然遇到问题,请告诉我,以便我或我们的一名云专家@levarne可以提供帮助。

答案 13 :(得分:1)

您需要在舞台上部署api,并使用舞台url转到“资源”,单击“操作”,然后选择“部署API”

现在,如果您遇到错误

  

{“消息”:“禁止”}。

请检查以下步骤

1)如果启用api密钥复制并在邮递员中传递密钥

enter image description here

2)现在您仍然遇到相同的错误,这意味着您将需要创建使用计划

enter image description here

3)设置限制并将计划分配给您的api

enter image description here

答案 14 :(得分:1)

我从Nginx Fargate服务尝试访问API网关中的私有API时收到此错误。我需要像这样在我的api中的资源策略下添加策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:<AccountID>:<RestApiID>/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "<VPC Endpoint ID for execute-api>"
                }
            }
        }
    ]
}

答案 15 :(得分:0)

将我的经验也放在这里。我尝试了上述所有操作,结果发现使用通配符的域名解决了我的 {“ message”:“ Forbidden”} 问题:* .mydomain.com

Custom domain

答案 16 :(得分:0)

我可能为时已晚,但是API网关发出“禁止”消息的原因之一是在GET操作上在请求正文中传递数据时。要解决该问题,请进行资源POST或不在请求正文中传递数据。

答案 17 :(得分:0)

请注意我在Swagger Editor中遇到的类似情况:

  • 我从API网关→阶段→选择“产品”→选择“导出”选项卡→将单选按钮切换到“ OpenAPI 3”→“导出为OpenAPI 3 + API网关扩展”导出了OpenAPI 3.0 YAML
  • 将收到的YAML粘贴到https://editor.swagger.io/
  • 执行简单的GET方法。
  • 它返回403 Forbidden,正文为{"message":"Forbidden"}
Swagger编辑器中的

curl命令如下:

curl -X GET "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com//Prod/users" -H "accept: application/json"

(请注意//前的双Prod)。

同样的curl命令却没有//通过命令行起作用!

有效的技巧是替换API网关生成的此server结构:

servers:
  - url: "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com/{basePath}"
    variables:
      basePath:
        default: "/Prod"

使用完整的url而不使用variables

servers:
  - url: "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com/Prod"

值得注意的是,从default: "/Prod"中删除前导斜杠没有帮助。

答案 18 :(得分:0)

在我的情况下,api密钥未启用。 确保将API设置为“已启用”。 enter image description here

答案 19 :(得分:0)

如@ gary69和@Adriaan Pelzer所述

https://stackoverflow.com/a/52727654/809043

https://stackoverflow.com/a/55136675/809043

您可以在请求以下消息时收到消息{“ message”:“ Forbidden”} 私有API。

因此,如果您有一个设置,其中所有流量都应通过API端点,而不是将流量定向到API网关,则可以使用以下参数。

APIGatewayVPCEndpoint:
  Type: 'AWS::EC2::VPCEndpoint'
  Properties:
    PolicyDocument: '{
        "Version":"2012-10-17",
        "Statement":[{
          "Effect":"Allow",
          "Principal": "*",
          "Action":["execute-api:Invoke"],
          "Resource":["arn:aws:execute-api:eu-north-1:000000000000:*/*"]
        }]
      }'
  ...
  VpcEndpointType: Interface
  PrivateDnsEnabled: true

如果启用了PrivateDnsEnabled,则API网关中的终结点必须为“私有”类型,并且需要添加策略。

  ApiGatewayRest:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Description: A mocked API
      Name: Mocked API
      EndpointConfiguration:
        Types:
          - PRIVATE
      Policy: '{
        "Version": "2012-10-17",
        "Statement": [{
          "Effect": "Allow",
          "Principal": "*",
          "Action": "execute-api:Invoke",
          "Resource": "arn:aws:execute-api:eu-north-1:000000000000:*/*/*/*"
        }]
      }'

这个论坛主题帮助我清除了一些细节

https://forums.aws.amazon.com/thread.jspa?threadID=286760

答案 20 :(得分:0)

使用Kong作为我们的api网关时,我们在生产中就遇到了这个问题。从Postman启动时,我们的请求通过了,但是通过Code启动时,我们的请求以403失败。启用了Kong中的Bot插件,该插件仅允许基于用户代理标头值从浏览器或移动应用发起的请求。我们通过Http Client发起的请求失败。一旦我们禁用了bot插件,就不会发生该错误。现在,如果用户代理为Apache-HttpClient / 4.5.2(Java / 1.8.0_91),则允许请求。

答案 21 :(得分:0)

这通常发生在我们尝试使用不正确的策略访问私有 API 端点且未在调用请求中传递“HOST”标头时。 假设我有一个 API,它部署为具有以下资源策略的私有端点。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:us-west-2:12345678:2ucqasdfasdfryc/*"
    },
    {
        "Effect": "Deny",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:us-west-2:12345678:2dgaucqt6dfgdyc/*",
        "Condition": {
            "StringNotEquals": {
                "aws:SourceVpce": "vpce-87878kjlkj8787k"
            }
        }
    }
]
}

禁用私有 DNS 主机名时访问私有 API 端点。

curl -v -H 'Host: 01234567ab.execute-api.us-west-2.amazonaws.com' https://vpce-01234567abcdef012-01234567.execute-api.us-east-1.vpce.amazonaws.com/test/pets

                          

[或] 使用 API ID 而不是 Host 标头。

curl -v -H 'x-apigw-api-id: 01234567' https://vpce-01234567abcdef012-01234567.execute-api.us-east-1.vpce.amazonaws.com/test/pets

答案 22 :(得分:0)

一周前我也遇到了同样的问题,并花了一些时间来确定问题。我们的 api 网关端点已配置为仅通过公共网络工作,并且我们有一个 WAF 和资源策略来过滤对端点的传入请求。我能够从不同的 vpc 而不是从特定的 vpc 访问端点。我收到了禁止错误。

最后,发现我尝试使用的 vpc 具有启用私有 DNS 的执行 api 服务的 VPC 端点。 API 网关端点正在解析为 VPC 内的私有 IP。

有两种方法可以解决。一,我们可以禁用私有DNS,这就是我所做的。更改后它开始工作得很好。但我们必须确保它不会影响使用 vpc 端点的其他人。

第二,我们可以使用自定义域名 & 我们可以使用它从 vpc 调用。