[解决] AWS(和StackOverflow)的新手。我正在尝试在AWS上创建一个lambda服务,并通过API网关从外部访问它,无需身份验证或限制。
为了方便起见,我现在将网关设置为模拟。
在API的Get方法中,授权设置为None
,API密钥为not required
。
当我尝试这个时,我得到{"message":"Forbidden"}
(如果我将它连接到实际的lambda服务,则相同的消息)。
有关如何使其可访问的任何建议? 感谢
答案 0 :(得分:47)
如果您设置了需要的API密钥'选项为true,请在下方查看。
答案 1 :(得分:35)
在API网关仪表板上,选择“资源”,单击“操作”,然后选择“部署API”。在首次部署之前,您将获得的唯一响应是assets:install
。
答案 2 :(得分:16)
如果您使用自定义域名并忘记选择目标登台,则会收到Forbidden
消息。
只需转到Custom Domain Names
,然后点击您网域下的Edit
,然后选择Base Path Mappings
下的阶段。
答案 3 :(得分:6)
我有类似的问题,我有以下内容:
我也没有设置任何授权或限制来简化。
我能够通过为每个阶段(dev,staging,prod)添加基本路径映射来解决问题。
答案 4 :(得分:4)
如果将必需的“ API”密钥设置为true,则需要将api密钥作为标头传递。
API密钥作为标头字段“ x-api-key”传递。即使在标头中添加此字段后,也可能会出现此问题。在这种情况下,请验证以下几点
答案 5 :(得分:3)
如果方法的Authorization
和API KEY Required
都设置为true,请确保在发送请求时有以下标题:
我使用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?
已启用API密钥?
如果您仍然遇到问题,请告诉我,以便我或我们的一名云专家@levarne可以提供帮助。
答案 13 :(得分:1)
您需要在舞台上部署api,并使用舞台url转到“资源”,单击“操作”,然后选择“部署API”
现在,如果您遇到错误
{“消息”:“禁止”}。
请检查以下步骤
1)如果启用api密钥复制并在邮递员中传递密钥
2)现在您仍然遇到相同的错误,这意味着您将需要创建使用计划
3)设置限制并将计划分配给您的api
答案 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)
答案 16 :(得分:0)
我可能为时已晚,但是API网关发出“禁止”消息的原因之一是在GET操作上在请求正文中传递数据时。要解决该问题,请进行资源POST或不在请求正文中传递数据。
答案 17 :(得分:0)
请注意我在Swagger Editor中遇到的类似情况:
403 Forbidden
,正文为{"message":"Forbidden"}
。 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)
答案 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:*/*/*/*"
}]
}'
这个论坛主题帮助我清除了一些细节
答案 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 调用。