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

上次更新日期:2022 年 5 月 11 日

在我创建 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 策略文档中明确拒绝访问的错误消息示例

{
    "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 授权方的“not authorized to access this resource(未获得访问此资源的授权)”错误

由于策略缓存,您可能会间歇性地收到 not authorized to access this resource(无权访问此资源)的错误。要确认授权缓存已启用,请检查 API Gateway 控制台中 Lambda 授权方的配置。然后执行下面的任意一项操作:

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

如果您一直看到这些错误,请检查 Lambda 授权方函数的代码,确定授权方为什么明确拒绝调用方的访问权限。如果您确定问题是由缓存引起的,则可以更新代码,使其允许调用方访问。有关说明,请参阅为什么我的 API Gateway 代理资源使用已激活缓存的 Lambda 授权方返回 HTTP 403 错误?

解决“not authorized to perform: execute-api:Invoke(未获得执行操作的授权:execute-api:Invoke)”错误

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

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