在我创建 AWS Lambda 授权方之后,对我的 Amazon API Gateway REST API 进行调用会收到 403 禁止访问错误。如何排查这些错误?
简短描述
在以下情况下,可能会发生此错误:
如果调用 API 时令牌或身份源缺失、空白或未经验证,您会收到 401 未授权错误。有关更多信息,请参阅为什么在创建 Lambda 授权方之后收到 API Gateway 401 未授权错误?
**注意:**本文仅讨论与针对 REST API 配置的 Lambda 授权方相关的 403 错误。有关排查其他类型的 403 错误的信息,请参阅如何排查来自 API Gateway 的 HTTP 403 禁止访问错误?
解决方法
确认引起错误的原因
注意:
1. 查看 API Gateway 响应中的错误消息。查找类似以下内容的错误消息。
Lambda 授权方函数在返回的 IAM policy 文档中明确拒绝访问的错误消息示例
{
"message": "User is not authorized to access this resource with an explicit deny"
}
Lambda 授权方函数在返回的 IAM policy 文档中隐式拒绝访问的错误消息示例
{
"message": "User is not authorized to access this resource"
}
在 REST API 的附加资源策略中隐式拒绝调用方访问的错误消息示例
{
"message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn>"
}
在 REST API 的附加资源策略中明确拒绝调用方访问的错误消息示例
{
"message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny"
}
**注意:**有关由 IAM policy 控制 API Gateway API 访问时产生的行为的更多信息,请参阅策略评估结果表。
2. 查看 CloudWatch 中的 API Gateway 执行日志,检查授权工作流。注意 Lambda 授权方的输出以及 API Gateway 资源策略评估的结果。您还会收到类似以下内容的错误消息。
必要的令牌缺失或与令牌验证不匹配时的日志错误消息实例
Extended Request Id: MY92nHDwwwIdGxzR=
Unauthorized request: <request-id>
注意:扩展请求 ID 是随机生成的。日志中的扩展请求 ID 值有所不同。
Lambda 授权方返回拒绝访问的策略时的日志错误消息示例
Sending request to https://lambda.<region>.amazonaws.com/2015-03-31/functions/<lambda-authorizer-arn>/invocations
Authorizer result body before parsing:
{
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Deny",
"Resource": "<resource-arn>"
}
]
}
}
Using valid authorizer policy for principal: <principal>
Successfully completed authorizer execution
The client is not authorized to perform this operation.
**注意:**返回的策略取决于您的 Lambda 授权方。如果返回的策略的 resource-arn 不包含请求的资源,则请求将被隐式拒绝。
API Gateway 资源策略拒绝请求时的日志错误消息示例
Extended Request Id: MY-BIVb4GEdGeZB=
ExplicitDenyException User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn> with an explicit deny: <request-id>
解决来自 Lambda 授权方的“not authorized to access this resource(未获得访问此资源的授权)”错误
由于策略缓存,您可能会间歇性地收到 not authorized to access this resource(无权访问此资源)的错误。要确认授权缓存已启用,请检查 API Gateway 控制台中 Lambda 授权方的配置。然后执行下面的任意一项操作:
如果您一直看到这些错误,请检查 Lambda 授权方函数的代码,确定授权方为什么明确拒绝调用方的访问权限。如果您确定问题是由缓存引起的,则可以更新代码,使其允许调用方访问。有关说明,请参阅为什么我的 API Gateway 代理资源使用已激活缓存的 Lambda 授权方返回 HTTP 403 错误?
解决“not authorized to perform: execute-api:Invoke(未获得执行操作的授权:execute-api:Invoke)”错误
通过查看 API 的资源策略来确定 API 资源策略是否无效,或者它是否明确拒绝调用的访问。您可以查看 API 的执行日志,以收到资源策略的响应结果。
有关更多信息,请参阅 Amazon API Gateway 访问策略语言概述和 Lambda 授权方和资源策略。
相关信息
使用 API Gateway Lambda 授权方
需要重新部署的 REST API 更新
在 API Gateway 中控制和管理对 REST API 的访问