收到信息:AWS API网关的回复被禁止。

140

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

为了简化事情,我现在将网关设置为模拟。

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

当我尝试这样做时,我得到了{"message":"Forbidden"}的错误信息(如果连接到实际的lambda服务,则也是相同的消息)。

如何使其可访问的建议?


2
你在部署之前添加了获取方法吗? - Cenxui
2
我想知道你是否没有正确的调用URL。 - Ka Hou Ieong
5
我无法对这个问题进行投反对票,但我想这样做。"类似于那样的"答案并没有帮助社区。我曾经因为serverless.yml文件中的错误缩进而遭遇过被禁止的消息。 - Perimosh
15
请选中正确答案旁边的复选标记,而不是在您的问题上添加“[solved]”。 谢谢! - Tim Malone
3
如果您能解释一下出了什么问题以及您是如何解决的,那将会非常有帮助。 - Eppilo
显示剩余6条评论
33个回答

132

如果您将 API Key Required 选项设置为 true,请检查以下内容:

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

6
谢谢Daniel,你的第三步帮助我修复了错误。 - Hector Magana
7
这对我有用,但必须使用“X-Api-Key”,看起来大小写很重要。 - pixelwiz
3
三个步骤都做好了。我已经创建了一个 API 密钥,但没有将其与使用计划或其他任何东西链接起来。非常感谢! - sidewaiise
9
你的回答中第三点经常被忽略,结果证明这是我的问题所在。 - Eppilo
1
@Marecky 和 pixelwiz,我刚刚处理了一个类似的问题,并且想要补充一下 pixelwiz 的经验,我也遇到了同样的问题。在搜索后,我发现 AWS API 网关确实存在“已知问题”,即它确实会在“区分大小写”的情况下处理标头。请查看此页面底部:https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html - JasonBub
显示剩余10条评论

100
在API网关仪表板上选择“资源”,点击“操作”并选择“部署API”。在您首次部署之前,您将得到的唯一响应是{"message":"Forbidden"}

23
我想补充一点,在部署后,请确保将您的阶段名称添加到URL中:abcdefg.execute-api.us-east-2.amazonaws.com/STAGE_NAME/ - user2465134
这应该是被接受的答案,因为作者明确表示API密钥不是必需的,并且当前被接受的答案特别解决了这个问题。 - Igor Silva

58

如果您使用自定义域名并忘记选择目标暂存区,您将收到 Forbidden 错误提示信息。

只需进入 自定义域名,点击您的域名下的 编辑,然后在 基础路径映射 下选择阶段。


2
工作得很好,请确保遵循@jneves的答案并重新部署。设置映射后,直到我重新部署了从基本路径映射中选择的阶段后,它才显示出来。 - Calvin Schemanski
总是会有一点遗漏!谢谢 - Kaymaz
这个隐藏的提示在我的工作中救了我一天,谢谢 :) - SlimenTN
7
对我来说也是如此。虽然他们在这里更新了GUI,但现在正确的区域是进入自定义域名 > API映射。 - NickC

19

您需要将 API 部署到阶段并使用阶段 URL,然后转到“资源”,单击“操作”并选择“部署 API”。

现在,如果您遇到错误

{"message":"Forbidden"}.

请检查以下步骤

1)如果您启用了 API 密钥,请复制并在 Postman 中传递密钥

enter image description here

2)现在,如果您仍然遇到相同的错误,那么您将需要创建使用计划

enter image description here

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

enter image description here


无法看到图片。 - albatross

17

我可能来晚了,但 API 网关提示“禁止访问”的原因之一是在 GET 操作中传递请求体数据。要解决这个问题,要么将资源改为 POST,要么不在请求体中传递数据。


之前在使用Insomnia时,将我的请求从POST改为GET。但是请求类型仍然是“GraphQL Query”,导致返回了403 Forbidden错误。将请求类型从“GraphQL Query”更改为“No Body”就解决了问题! - naribo
2
你救了我的命! - hirikarate
非常感谢你! - zarathoustra

12
这可能不太明显,但当使用AWS API Gateway时,看到"Forbidden"错误的另一个原因可能是调用了不对应任何已部署API方法的URL。如果你确实错过了URL (例如,没有调用https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users(注意users前面的dev阶段)而是调用了https://9999xx9x99.execute-api.us-east-1.amazonaws.com/users(没有阶段)。你期望得到404,但你会得到403。
顺便说一下:在将部署放置到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时看到“Forbidden”错误的另一个原因可能是调用不正确的URL,该URL与任何已部署的API方法都不对应。如果您实际上正在访问错误的URL(例如,而不是调用https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users(请注意dev stage在users之前),您调用了https://9999xx9x99.execute-api.us-east-1.amazonaws.com/users(没有stage)。您期望得到404,但会得到403。如何在ruby rack aws lambda api gateway端点中解决此问题? - Ankita Dhandha
@AnkitaDhandha,请提出一个新问题。 - madhead

10

我曾经遇到过类似的问题,解决方法如下:

  1. 一个自定义域名(边缘优化)
  2. 多个阶段(开发、测试、生产等)

为了简化事情,我没有设置任何授权或限制。

通过为每个阶段(开发、测试、生产等)添加基本路径映射,我成功地解决了这个问题。


2
我有多个API的相同基本设置。有趣的是,即使只有一个API实际上已部署,我仍然收到“Forbidden”错误,直到为未部署的API设置了基本路径映射。 - Dan
我在使用自定义域名和多个阶段时遇到了同样的问题,但我是通过CDK和每个阶段不同的堆栈进行部署的。即使我将所有堆栈一起部署,其中一个阶段仍然会出现Forbidden错误。有任何想法吗? - GeorgeGeorgitsis

9
如果您将“API”密钥要求设置为true,则需要将API密钥作为标头传递。
API密钥作为标头字段“x-api-key”传递。即使在标头中添加了此字段,仍可能出现此问题。在这种情况下,请验证以下几点:
- 您是否有使用计划?如果没有,需要创建一个。 - 将您的API与使用计划链接起来。为此,请添加一个阶段,它将链接您的API。 - 您是否有API密钥?如果没有,则需要创建并启用API密钥。 - 将与您的API相关联的使用计划添加到此API密钥中。为此,请添加使用计划。

6

在我的案例中,这是因为我使用了

托管-全部查看器(Managed-AllViewer)

请求策略。将其切换为

托管-用户代理引荐头部(Managed-UserAgentRefererHeaders)

问题得到了解决。

我的客户端发送了一个Accept-Encoding头部,但CloudFront不允许。您可以通过创建自定义起源请求策略来验证此操作,选择“白名单”类型,尽管可从列表中选择Accept-Encoding,但在创建策略时会收到错误信息:"The parameter Headers contains Accept-Encoding that is not allowed."

不幸的是,我没有找到相关文档。也不知道为什么不允许这样一个不显眼的标头。


这解决了我的问题。我可以通过 API Gateway 上的 invoke 运行所有方法,但是当我在 Postman 中运行相同的方法进行测试时,所有 POST 方法都返回 403。 - Tony Law

6
我所经历的另一个原因,在这里我没有看到它被提到,那就是发布后立即尝试访问API。我点击了发布按钮并看到“您的API可以在”域名下访问,然后立即将其复制并粘贴到Postman中检查。我得到了禁止访问的消息。什么都没改过。检查了所有设置,以确保我没有做错任何事情 - 一切都正确。我有点抓狂。
几分钟后再回来尝试,因为我非常确定我做得都对-它奏效了。
DNS问题。无论互联网有多快,它都不是瞬间的 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接