在我为 Amazon API Gateway REST API 创建 AWS Lambda 授权方后,我收到了针对 API 调用的“403 Forbidden”错误。
简短描述
**注意:**此解决方案仅可解决为 REST API 配置的 Lambda 授权方相关的 403 错误。有关其他类型的 403 错误的故障排除信息,请参阅如何排查 API Gateway 中的 HTTP 403 错误?
“403 Forbidden”错误可能由于以下原因而发生:
如果 API 调用的令牌或身份来源缺失、为 null 或未经验证,则您会收到“401 Unauthorized”错误。有关详细信息,请参阅为什么我在创建 Lambda 授权方后收到 API Gateway“401 Unauthorized”错误?
解决方法
确认错误的原因
为您的 API Gateway REST API 启用 Amazon CloudWatch Logs(如果尚未启用)。如果您更改授权方配置,请重新部署 API。
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
查看错误日志消息
在 API Gateway 的响应中,在以下示例中查找错误日志消息。
返回包含显式拒绝的 IAM 策略文档的 Lambda 授权方函数的错误日志消息示例:
{ "message": "User is not authorized to access this resource with an explicit deny"}
附加了隐式拒绝调用方访问的资源策略的 REST API 的错误日志消息示例:
{ "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> with an explicit deny"}
**注意:**有关 IAM 策略控制的 API Gateway API 的详细信息,请参阅策略评估结果表。
查看 API Gateway 日志
要查看授权工作流程,请查看 CloudWatch Logs 中的 API Gateway 执行日志。记下 Lambda 授权方的输出和 API Gateway 资源策略评估的结果。在以下示例中查找日志错误消息。
所需令牌缺失或与令牌验证不匹配时的错误日志消息示例:
Extended Request Id: EXAMPLEabcIdGxzR=Unauthorized request: request-id
**注意:**日志中的 Extended Request Id(扩展请求 ID)值不同,因为它是随机生成的。
Lambda 授权方返回拒绝访问策略时的错误日志消息示例:
Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/lambda-authorizer-arn/invocationsAuthorizer 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: EXAMPLE1ABdGeZB=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”错误。要确认 Authorization Caching(授权缓存)是否已启用,请在 API Gateway 控制台中查看您的 Lambda 授权方的配置。然后,执行以下操作之一:
- 要进行一次性测试,请运行 AWS CLI 命令 flush-stage-authorizers-cache。刷新授权方的缓存条目后,再次调用您的 API。
- 关闭策略缓存,重新部署您的 API 以提交更改,然后再次调用您的 API。
**注意:**如果为基于请求参数的授权方停用策略缓存,则 API Gateway 在调用 Lambda 授权方函数之前不会验证对您的 API 的调用。
- 要更改授权方的缓存密钥,请更新在 Token Source(令牌来源)(针对基于令牌的授权方)或 Identity Sources(身份来源)(针对基于请求参数的授权方)中指定的标头名称。部署 API 以提交更改。然后,使用新配置的令牌标头或身份来源再次调用您的 API。
要确定授权方为何显式拒绝调用方访问,请查看您的 Lambda 授权方函数的代码。如果您确定问题是由缓存引起的,请更新代码以允许调用方访问。
有关说明,请参阅为什么使用已激活缓存的 Lambda 授权方的 API Gateway 代理资源返回 HTTP 403“User is not authorized to access this resource”错误?
解决“not authorized to perform: execute-api:Invoke”错误
要确定您的 API 资源策略是否无效,或是否显式拒绝访问调用,请查看您的 API 资源策略。您可以查看 API 执行日志以获取资源策略的响应结果。有关详细信息,请参阅 Amazon API Gateway 的访问策略语言概述和 Lambda 授权方和资源策略。
相关信息
使用 API Gateway Lambda 授权方
在 API Gateway 中控制和管理对 REST API 的访问