跳至内容

如何解决在 API Gateway REST API 中使用 Lambda 授权方时出现的“HTTP 403 Forbidden”错误?

3 分钟阅读
0

在我为 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 in an identity-based policy"}

附加了隐式拒绝调用方访问的资源策略的 REST API 的错误日志消息示例:

{    "message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: API_RESOURCE_ARN because no resource-based policy allows the execute-api:Invoke action"}

注意: 仅当没有其他授权机制显式允许该请求时,资源策略的隐式拒绝才会导致 403 错误。如果 Lambda 授权方返回 Allow 语句,则该语句会覆盖资源策略的隐式拒绝,请求将成功。

附加了显式拒绝调用方访问的资源策略的 REST API 的错误日志消息示例:

{    "message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: API_RESOURCE_ARN with an explicit deny in a resource-based policy"}

注意: 有关 IAM 策略控制的 API Gateway API 的详细信息,请参阅策略评估结果表。

查看 API Gateway 日志

要查看授权工作流程,请查看 CloudWatch Logs 中的 API Gateway 日志。请注意 Lambda 授权方的输出和 API Gateway 资源策略评估的结果。查找类似于以下示例的日志错误消息:

所需令牌缺失或与令牌验证不匹配时的错误日志消息示例:

Extended Request Id: EXAMPLEabcIdGxzR=
Unauthorized request: REQUEST_ID
Gateway response type: UNAUTHORIZED with status code: 401

注意: 日志中的 Extended Request Id(扩展请求 ID)值不同,因为它是随机生成的。

Lambda 授权方返回拒绝访问策略时的错误日志消息示例:

Starting authorizer: AUTHORIZER_ID for request: REQUEST_ID
Incoming identity: {IDENTITY_SOURCE=MASKED_VALUE}
Using valid authorizer policy for principal: PRINCIPAL
Successfully completed authorizer execution
The client is not authorized to perform this operation.
Gateway response type: ACCESS_DENIED with status code: 403

注意: 返回的策略取决于您的 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 in a resource-based policy: REQUEST_ID
Gateway response type: DEFAULT_4XX with status code: 403

解决由授权方响应中资源 ARN 不匹配导致的 403 错误

Lambda 授权方可以返回有效的 Allow 策略。如果策略语句中的 Resource Amazon 资源名称(ARN)与所调用的 API Gateway 方法的 ARN 不匹配,则您会收到“403 Forbidden”响应。API Gateway 响应或 CloudWatch Logs 中没有关于该错误的其他详细信息。

当授权方动态构建 Resource ARN 并在以下任一组件中引入不匹配时,就会出现这种情况:

  • API 阶段名称,例如 prod,而不是 dev
  • HTTP 方法,例如 GET,而不是 POST
  • 资源路径,例如 /users,而不是 /users/*

要解决此问题,请完成以下步骤:

  1. 在 CloudWatch Logs 中查看 Lambda 授权方的输出。在授权方返回的 IAM 策略文档中找到 Resource 字段。
  2. 将策略中的 Resource ARN 与您调用的 API Gateway 方法的 ARN 进行比较。ARN 必须使用以下格式:
    arn:aws:execute-api:{region}:{account-id}:{api-id}/{stage}/{HTTP-METHOD}/{resource-path}
  3. 确认授权方响应中的阶段、HTTP 方法和资源路径与您调用的方法完全匹配。例如,如果您调用 GET /prod/users,则 Resource ARN 必须包含 prod/GET/users,而不是 dev/GET/users 或 prod/POST/users。
  4. 如果授权方在 Resource 字段中使用了通配符(*****),请确认通配符模式涵盖了所调用的方法。例如,arn:aws:execute-api:{region}:{account-id}:{api-id}/prod/GET/* 允许 prod 阶段下的所有 GET 请求。
  5. 更新您的 Lambda 授权方代码,使其返回与所调用的 API 方法匹配的正确 Resource ARN,然后 重新部署 API。

注意: 由于此类 403 错误不会在 CloudWatch Logs 中产生独特的错误消息,因此很难与其他授权失败区分开来。如果您确认授权器返回了 Allow 策略但仍然收到 403 错误,请首先检查 Resource ARN 不匹配的问题。

解决 Lambda 授权方返回的“not authorized to access this resource”错误

由于策略缓存,您会间歇性地收到“not authorized to access this resource”错误。要确认授权缓存是否已启用,请在 API Gateway 控制台中查看您的 Lambda 授权方的配置。然后,执行以下操作之一:

  • 要进行一次性测试,请运行 AWS CLI 命令 flush-stage-authorizers-cache。清除授权器的缓存条目后,再次调用您的 API。
    注意: 缓存清除可能需要几秒钟才能完全传播到所有 API Gateway 端点。
  • 关闭授权缓存,重新部署您的 API 以提交更改,然后再次调用您的 API。
    注意: 使用 API Gateway 控制台中的 Authorization Caching 开关来关闭授权缓存。TTL 字段仅接受 1 到 3600 秒之间的值。您无法将 TTL 值设置为 0。
  • 要更改授权方的缓存密钥,请更新在 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”错误

当资源策略显式拒绝调用方访问时,您会收到此错误。错误消息中包含“with an explicit deny in a resource-based policy”。

当资源策略因没有语句允许该请求而隐式拒绝访问时,您也会收到此错误。错误消息中包含“because no resource-based policy allows the execute-api:Invoke action”。

要确定您的 API 资源策略是否无效,或是否显式或隐式拒绝访问调用,请查看您的 API 资源策略。然后,查看 API 日志以获取资源策略的响应结果。有关详细信息,请参阅 Amazon API Gateway 的访问策略语言概述和 Lambda 授权方和资源策略。

相关信息

Control and manage access to REST APIs in API Gateway(在 API Gateway 中控制和管理对 REST API 的访问)

AWS 官方已更新 1 个月前