为什么我在创建 Lambda 授权方后收到 API Gateway 401 未经授权错误?

上次更新日期:2022 年 9 月 20 日

我的 Amazon API Gateway API 在我为其创建 AWS Lambda 授权方后返回 401 未经授权错误。为什么会发生这种情况?如何排查此问题?

简短描述

注意:API Gateway 可能会因很多原因返回 401 未经授权错误。本文仅介绍 API Gateway 在未调用授权方 Lambda 函数的情况下返回的 401 未经授权响应错误。

具有 Lambda 授权方的 API 网关 API 收到未经授权的请求时,API Gateway 将返回 401 未经授权响应。

对于基于令牌的 Lambda 授权方

401 未经授权错误通常会在必需的令牌缺失或授权方的令牌验证表达式使令牌失效时发生。

对于基于请求参数的 Lambda 授权方

401 未经授权错误通常在配置的身份源缺失、为 null、空或无效时发生。

要解决此类错误,请通过查看 Lambda 授权方的配置来验证对 API 的请求中必须包含的信息。然后,通过使用所需的标头和令牌值或身份源调用您的 API 来测试授权方。

注意:有关 Lambda 授权方设置的示例,请参阅创建基于令牌的 Lambda 授权方函数创建基于请求的 Lambda 授权方函数

解决方法

查看 Lambda 授权方的配置

1.    打开 API Gateway 控制台

2.    在 API 窗格中,选择您的 API 的名称。

3.    在导航窗格中,在 API 名称下选择 Authorizers(授权方)。随即打开 Authorizers(授权方)页面。

4.    根据您的使用案例,查看授权方的配置以了解以下其中一项:

对于基于令牌的 Lambda 授权方

如果 Lambda 事件有效负载被设置为令牌,则检查令牌源值。在调用 API 时,必须使用令牌源值作为请求标头。

重要提示:如果您为令牌验证输入正则表达式,则 API Gateway 会根据此表达式验证令牌。例如,如果输入正则表达式 \ w{5},则只会成功验证包含 5 个字符的字母数字字符串的令牌值。

-或者-

对于基于请求参数的 Lambda 授权方

如果将 Lambda 事件有效负载设置为请求,请检查配置的身份源。身份源可能是标头、查询字符串、多值查询字符串、阶段变量$context 变量

重要提示:如果开启了授权缓存,则会针对所有已配置的身份源验证对 API 的请求。

5.    如果您已开启授权缓存(例如,“授权缓存 1 分钟”),则关闭缓存以便在下一步中进行测试。

有关更多信息,请参阅使用 API Gateway 控制台配置 Lambda 授权方

部署您的 API

如果您更改了 Lambda 授权方的配置或任何其他 API 设置,请重新部署您的 API 以提交更改。

测试您的 Lambda 授权方

要测试您的 Lambda 授权方,请执行以下操作之一对您的 API 进行测试调用:

重要提示:请确保根据 Lambda 授权方的配置格式化请求。

使用 API Gateway 控制台测试 Lambda 授权方

1.    打开 API Gateway 控制台

2.    在 API 窗格中,选择您的 API 的名称。

3.    在导航窗格中,在 API 名称下选择 Authorizers(授权方)。

4.    在 Authorizers(授权方)页面上,为您的授权方选择 Test(测试)。

5.    在 Test Authorizer(测试授权方)对话框中,根据您的使用案例执行以下操作之一:

对于基于令牌的 Lambda 授权方

1.    选择 Test(测试),但不要在 Authorization Token(授权令牌)中输入任何值。 API Gateway 会返回响应代码:401,因为 Authorization Token(授权令牌)为空。

2.    如果配置了带有正则表达式 \ w{5}Token Validation(令牌验证),请输入一个无效值(如“abc123”)作为 Authorization Token(授权令牌)。然后,选择 Test(测试)。API Gateway 会返回 Response Code: 401(响应代码:401),因为 Authorization Token(授权令牌)不满足 Token Validation(令牌验证)表达式。

3.    对于 Authorization Token(授权令牌)值,请输入 allow,然后选择 Test(测试)。API Gateway 会返回响应代码:200 消息。

-或者-

对于基于请求参数的 Lambda 授权方

1.    删除 Request Parameters(请求参数),然后选择 Test(测试)。API Gateway 会返回响应代码:401,因为缺请求参数

2.    对于 Request Parameters(请求参数),请输入 headerValue1queryValue1stageValue1,然后选择 Test(测试)。API Gateway 会返回响应代码:200 消息。

使用 Postman 或 curl 测试 Lambda 授权方

有关如何使用 Postman 应用程序测试 Lambda 授权方的说明,请参阅使用 API Gateway Lambda 授权方调用 API

有关 curl 的更多信息,请参阅 cURL 项目网站

注意:

  • 如果您在测试前为 Lambda 授权方关闭了 Authorization Caching(授权缓存),您可以在测试后重新激活它。如果您重新激活 Authorization Caching(授权缓存),请确保重新部署 API 以提交更改。
  • 如果您收到来自 Lambda 授权方的跨源资源共享(CORS)错误,则可以为 DEFAULT 4XX API Gateway 响应添加 CORS 标头。有关更多信息,请参阅如何解决我的 API Gateway API 中的 CORS 错误?