获取消息:禁止从AWS API网关回复


77

我正在尝试在AWS上创建lambda服务,并通过API网关从外部访问它,而无需身份验证或限制。

为了使事情变得容易,我现在将网关设置为模拟。

在API的Get方法上,将Authorization设置为None,API Key为not required

尝试此操作时,我收到{"message":"Forbidden"} (如果我将其连接到实际的lambda服务,则显示相同的消息)。

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


2
在部署之前是否添加了get方法?
岑x

1
我想知道您没有正确的调用URL。
Ka Hou Ieong '16

4
我不能否决这个问题,但我想这样做。“类似”的答案对社区没有帮助。我已经尝试过禁止邮件,因为serverless.yml文件中的缩进错误。
Perimosh

12
请选择正确答案旁边的对号,而不要添加[solved]到您的问题中。谢谢!
蒂姆·马隆

2
如果您解释了错误和解决方法,将很有用。
Eppilo

Answers:


81

如果您将“需要API密钥”选项设置为true,请检查以下内容。

  1. 您必须将“ x-api-key” HTTP标头参数传递给API网关。
  2. 必须创建API密钥。
  3. 此外,您需要在API网关控制台上检查API密钥的使用计划。

3
感谢Daniel,您的第三步使我可以纠正我的错误。
赫克托·麦格纳

5
这对我
有用

3
这三个步骤都对我有用。我已经创建了一个API密钥,但没有将其链接到使用计划或任何其他内容。非常感谢!
sidewaiise

5
答案中的第3点通常被忽略。原来是我的问题。
Eppilo

1
@Marecky和pixelwiz,我只是在处理类似的问题,而要增加pixelwiz的经验,我也遇到了同样的问题。搜索后,我发现AWS API Gateway确实存在一个“已知问题”,即它以“区分大小写”的方式进行了INDEED进程标头。请查看此页面的底部:docs.aws.amazon.com/apigateway/latest/developerguide/…–
JasonBub

60

在API Gateway仪表板上,选择“资源”,单击“操作”,然后选择“部署API”。在首次部署之前,您将获得的唯一答复是{"message":"Forbidden"}


12
我要补充一点,在部署之后,请确保将阶段名称添加到URL:abcdefg.execute-api.us-east-2.amazonaws.com/STAGE_NAME/
user2465134 '17

33

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

只需转到Custom Domain NamesEdit在您的域下单击,然后在下选择阶段Base Path Mappings


1
效果很好,请确保遵循@jneves的回答并(重新)部署。设置完映射后,直到我重新部署从“基本路径映射”中选择的阶段后,它才显示出来。
加尔文·Schemanski

11

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

现在,如果您遇到错误

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

请检查以下步骤

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

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明


无法看到图像
albatross

7

我有一个类似的问题,并且有以下问题:

  1. 自定义域(边缘优化)
  2. 多个阶段(开发,登台,生产)

我也没有设置任何授权或限制来简化事情。

通过为每个阶段(开发,登台,生产)添加基本路径映射,我能够解决此问题。


我使用多个API进行了相同的基本设置。有趣的是,即使实际上只部署了我的一个API,在为未部署的API设置基本路径映射之前,我仍然收到“禁止”消息。

5

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

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

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

5

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


正在使用Insomnia,并将我的请求从POST更改为GET。请求类型仍在GraphQL Query-返回403禁止错误。将请求类型从更改GraphQL QueryNo Body成功!
naribo

你救了我的命!
hirikarate

4

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

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


这可能并不很明显,但是使用AWS API Gateway时看到“禁止”错误的另一个原因可能是调用了与任何已部署的API方法都不对应的错误URL。如果您实际上输入错误的URL(例如,而不是调用9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users(请注意用户之前的dev阶段)而不是调用9999xx9x99.execute-api),则可能会发生这种情况。 us-east-1.amazonaws.com/users(无阶段),您希望获得404,但您将获得403.如何在ruby rack aws lambda api网关端点中解决此问题?
Ankita Dhandha

@AnkitaDhandha,提出一个新问题。
madhead

3

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

  1. 内容类型(如果调用GET,通常为application / x-www-form-urlencoded)
  2. 主办
  3. X-Amz-Date
  4. 授权书
  5. X-API键

我使用POSTMAN的API测试非常可靠,因此直截了当。

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


3

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

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

请过几分钟再返回尝试,因为我很确定自己做对了-可以。

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


2

我从尝试访问API Gateway中的私有API的Nginx Fargate服务收到此错误。我需要像这样在我的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>"
                }
            }
        }
    ]
}

2

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

启用了CORS?

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

已启用API密钥?

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

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


2

我可能已经遇到了解决该问题的方法。我在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 Mavericks,Mountain Lion和Lion

sudo killall -HUP mDNSResponder

Mac OS X雪豹

sudo dscacheutil -flushcache

1

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


1

我获得{"message":"Forbidden"}了一个EndpointConfiguration设置为PRIVATE的API,并在Vpc的专用子网中为其创建了一个VpcEndpoint(这是一个服务间API)

我得到的原因{"message":"Forbidden"}是,我觉得我应该使用VpcEndpoint的网址之一。使用的URL仍然是与阶段关联的URL(在ApiGateway控制台中)。它是:

https://${RestApiId}.execute-api.${Region}.amazonaws.com/${StageName}


0

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


0

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

自定义域


0

只是关于我在Swagger Editor中遇到的类似情况的注释:

  • 我从API网关→阶段→选择“产品”→选择“导出”选项卡→将单选按钮切换到“ OpenAPI 3”→“导出为OpenAPI 3 + API网关扩展”导出了OpenAPI 3.0 YAML
  • 将收到的YAML粘贴到https://editor.swagger.io/
  • 执行一个普通的GET方法。
  • 403 Forbidden{"message":"Forbidden"}身体返回。

curl Swagger Editor的命令如下所示:

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

(请注意//之前的双精度Prod)。

而同一curl命令却没有//通过命令行起作用!

有效的技巧是替换serverAPI Gateway生成的返回的此结构:

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"没有帮助。


0

在我的情况下,api密钥未启用。确保将API设置为“已启用”。 在此处输入图片说明


0

正如@ gary69和@Adriaan Pelzer提到的

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

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

请求私有API时,您会收到消息{“ message”:“ Forbidden”}。

因此,如果您进行了所有流量都应经过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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.