当我为 Amazon API Gateway API 创建 AWS Lambda Authorizer 时,我收到“401 Unauthorized”错误。
简短描述
当拥有 Lambda 授权方的 API Gateway API 收到未经授权的请求时,API Gateway 会返回 401 Unauthorized(401 未经授权)响应。
注意: API Gateway 会因多种原因返回“401 Unauthorized”错误。本文探讨了由授权凭证(令牌、标头、查询参数)缺失或无效而导致的 401 错误,这些错误会导致 API Gateway 的预授权验证失败。当 API Gateway 在调用 Lambda 授权方函数之前拒绝请求时,就会出现这些错误。
对于基于令牌的 Lambda 授权方
“401 Unauthorized”错误通常发生在缺少所需令牌,或授权方的令牌未通过验证表达式的验证时。
对于基于请求参数的 Lambda 授权方
“401 Unauthorized”错误通常发生在配置的身份源缺失、为空值、为空或无效时。
要对此类错误进行故障排除,请验证您在 API 请求中包含的必填信息。然后,使用所需的标头和令牌值或身份源,调用您的 API 来测试授权方。
有关 Lambda 授权方设置示例,请参阅 Example TOKEN authorizer Lambda function(TOKEN 授权方 Lambda 函数示例)和 Example REQUEST authorizer Lambda function(REQUEST 授权方 Lambda 函数示例)。
解决方法
查看 Lambda 授权方的配置
完成以下步骤:
- 打开 API Gateway 控制台。
- 在 API 中,选择您的 API 的名称。
- 在您的 API 的名称下,选择 Authorizers(授权方)。
- 根据您的使用案例查看授权方的配置:
基于令牌的 Lambda 授权方
如果 Lambda Event Payload(Lambda 事件负载)被设置为 Token(令牌),则检查 Token Source(令牌源)值。在调用 API 时,必须使用 Token Source(令牌源)值作为请求标头。
重要事项: 如果您为 Token Validation(令牌验证)输入了正则表达式,则 API Gateway 会根据该表达式验证令牌。例如,如果您输入正则表达式 \w{5},则令牌值必须包含由 5 个字母数字字符组成的字符串,否则无法成功验证。
基于请求参数的 Lambda 授权方
如果 Lambda Event Payload(Lambda 事件负载)被设置为 Request(请求),则检查配置的 Identity Sources(身份源)。身份源可能是标题、查询字符串、多值查询字符串、阶段变量或 $context 变量。
重要事项: 如果启用 Authorization Caching(授权缓存),则系统会对照所有配置的身份源对 API 请求进行验证。请关闭缓存以测试您的 Lambda 授权方。
部署 API
如果您更改了 Lambda 授权方的配置或任何其他 API 设置,请重新部署您的 API 以提交更改。
测试您的 Lambda 授权方
要测试您的 Lambda 授权方,请使用 API Gateway 控制台、cURL 或 Postman 对您的 API 进行调用测试。
重要事项: 根据您的 Lambda 授权方的配置对请求进行格式化。
使用 API Gateway 控制台测试 Lambda 授权方
完成以下步骤:
- 打开 API Gateway 控制台。
- 在 API 中,选择您的 API 的名称。
- 在您的 API 的名称下,选择 Authorizers(授权方)。
- 在 Authorizers(授权方)中,选择要测试的授权方的名称。
- 在 Test Authorizer(测试授权方)中,针对您的使用案例完成以下步骤:
基于令牌的 Lambda 授权方
选择 Test authorizer(测试授权方),不要为 Authorization Token(授权令牌)指定值。API Gateway 会返回“Response Code: 401”,因为 Authorization Token(授权令牌)为空。
如果您使用正则表达式 \w{5} 来配置 Token Validation(令牌验证),则为 Authorization Token(授权令牌)输入一个无效的值,例如“abc123”。然后,选择 Test authorizer(测试授权方)。API Gateway 会返回“Response Code: 401”,因为 Authorization Token(授权令牌)不满足 Token Validation(令牌验证)表达式的要求。
对于 Authorization Token(授权令牌)值,输入 allow(允许),然后选择 Test authorizer(测试授权方)。API Gateway 会返回“Response Code: 200”(响应代码:200)消息。
基于请求参数的 Lambda 授权方
请删除请求参数,然后选择 Test authorizer(测试授权方)。API Gateway 会返回“Response Code: 401”,因为缺少请求参数。
对于 Request Parameters(请求参数),输入 headerValue1、queryValue1 和 stageValue1,然后选择 Test authorizer(测试授权方)。API Gateway 会返回“Response Code: 200”(响应代码:200)消息。
使用 Postman 或 cURL 测试 Lambda 授权方
有关如何使用 Postman 测试 Lambda 授权方的说明,请参阅 Call an API with API Gateway Lambda authorizers(使用 API Gateway Lambda 授权方调用 API)。有关 Postman 的详细信息,请访问 Postman 网站。
有关 curl 的信息,请参阅 curl 项目网站上的curl。
注意: 如果您在测试之前禁用了 Lambda 授权方的授权缓存,请在测试结束后重新激活它。
当您重新激活授权缓存时,请重新部署您的 API 以提交更改。如果您收到来自 Lambda 授权方的跨源资源共享 (CORS) 错误,请为 DEFAULT 4XX API 网关响应添加 CORS 标头。有关详细信息,请参阅如何解决 API Gateway API 的 CORS 错误?
相关信息
什么是 Amazon API Gateway?
Control and manage access to REST APIs in API Gateway(在 API Gateway 中控制和管理对 REST API 的访问)
如何启用 CloudWatch Logs 以对 API Gateway REST API 或 WebSocket API 进行故障排除?