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

上次更新时间:2020 年 5 月 14 日

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

简短描述

注意: API Gateway 可能会因各种原因返回 403 禁止访问错误。本文仅讨论与针对 REST API 配置的 Lambda 授权方相关的 403 错误。

如果结合使用 API Gateway REST API 与 Lambda 授权方返回 403 错误,则通常是出于以下原因之一:

解决方法

请执行以下问题排查步骤,帮助确定错误的原因并解决问题。

确定错误的原因

1.    查看 API Gateway 响应中的错误消息。

如果 API 调用包含无效令牌或身份来源,则您会看到与以下类似的错误消息:

{
    errorMessage: Unauthorized
}

如果 Lambda 授权方函数返回包含显式拒绝的 IAM 策略文档,则您会看到与以下类似的错误消息:

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

如果 API 附加的资源策略隐式或显式拒绝调用方访问, 则您会看到与以下类似的错误消息:

{
 Message: "User: anonymous is not authorized to perform: execute-api:Invoke on resource: <api-resource-arn>"
}

2.    查看 CloudWatch 中的 API Gateway 执行日志,以检查授权工作流。您可以查看 Lambda 授权方的输出以及 API Gateway 资源策略评估结果。

注意:如果尚未在 Amazon CloudWatch Logs 中启用 API Gateway 日志记录,请参阅如何启用 CloudWatch Logs 以对 API Gateway REST API 或 WebSocket API 进行问题排查?

如果所需令牌缺失或与令牌验证不匹配,则不会调用 Lambda 授权方,并且您会看到与以下类似的日志消息:

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>

解决“未经授权访问”错误

1.    查看 API Gateway 控制台中的 Lambda 授权方配置,以确定 API 调用中必须包含的内容。有关更多信息,请参阅 Amazon API Gateway Lambda 授权方输入

注意:如果您更改 Lambda 授权方的配置,请确保重新部署您的 API 以提交更改。

2.    再次调用您的 API。请确保包括您上一步在控制台中确认的配置令牌或身份来源。

有关更多信息,请参阅为什么在创建 Lambda 授权方之后收到 API Gateway 401 未经授权访问错误?

解决来自 Lambda 授权方的“未经授权访问此资源”错误

如果您间歇性地看到此错误,则可能是因策略缓存所致。检查 API Gateway 控制台中的 Lambda 授权方配置,以验证授权缓存是否已启用。然后,执行以下任意操作:

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

如果您一直看到此错误,请检查 AWS Lambda 中的 Lambda 授权方函数的代码,以确定您的授权方为什么显式拒绝调用方的访问。

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

检查 API 的资源策略,以确定策略是否有效,或者它是否显式拒绝调用方的访问。您可以查看 API 的执行日志,以查看资源策略的响应结果。

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