如何排查使用 Lambda 授权方与 API Gateway REST API 时遇到的 HTTP 403 禁止访问错误?

上次更新时间:2021 年 5 月 18 日

在我创建 AWS Lambda 授权方之后,对我的 Amazon API Gateway REST API 进行调用会收到 403 禁止访问错误。如何排查这些错误?

简短描述

注意:API Gateway 可能会因各种原因返回 403 禁止访问错误。本文仅讨论与针对 REST API 配置的 Lambda 授权方相关的 403 错误。有关排查其他类型的 403 错误的信息,请参阅如何排查来自 API Gateway 的 HTTP 403 禁止访问错误?

使用 Lambda 授权方的 API Gateway REST API 返回 403 错误有两个常见原因:

如果调用 API 时令牌或身份来源缺失、空白或未经验证,您将看到 401 未授权错误。有关更多信息,请参阅为什么在创建 Lambda 授权方之后收到 API Gateway 401 未授权错误?

解决方法

确认引起错误的原因

注意:如果您还没有为 API Gateway REST API 启用 CloudWatch Logs,请启用。

1.    查看 API Gateway 响应中的错误消息。查找类似以下内容的错误消息。

Lambda 授权方函数在返回的 IAM 策略文档中明确拒绝访问的错误消息示例

{
    "message": "User is not authorized to access this resource with an explicit deny"
}

在 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 策略控制 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 授权方。

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 授权方的“未获得访问此资源的授权”错误

如果您发现未获得访问此资源的授权错误间歇性出现,则该错误可能是由策略缓存引起的。要确认授权缓存已启用,请检查 API Gateway 控制台中 Lambda 授权方的配置。然后执行下面的任意一项操作:

  • 对于一次性测试,请从 AWS 命令行界面 (AWS CLI) 运行 flush-stage-authorizers-cache 命令。刷新授权方的缓存条目之后,再次调用您的 API
  • 关闭策略缓存,然后再次调用您的 API
    注意:如果为基于请求参数的授权方关闭策略缓存,则 API Gateway 在调用 Lambda 授权方函数之前不会验证您的 API 调用。
  • 更改授权方的缓存密钥,方法是更新令牌来源(对于基于令牌的授权方)或任何身份来源(对于基于请求参数的授权方)中指定的标头名称。重新部署 API 以提交更改。然后,使用新配置的令牌标头或身份来源再次调用您的 API

如果您一直看到这些错误,请检查 Lambda 授权方函数的代码,确定授权方为什么明确拒绝调用方的访问权限。然后,更新代码,使其允许调用方访问。

解决“未获得执行操作的授权:execute-api:Invoke”错误

通过查看 API 的资源策略来确定 API 资源策略是否无效,或者它是否明确拒绝调用的访问。您可以查看 API 的执行日志,以查看资源策略的响应结果。

有关更多信息,请参阅 Amazon API Gateway 访问策略语言概述Lambda 授权方和资源策略