在设置 Amazon Cognito 用户池后,如何对 API Gateway REST API 终端节点的“401 未经授权”错误进行故障排除?

上次更新日期:2021 年 3 月 30 日

我在 Amazon API Gateway REST API 上将我的 Amazon Cognito 用户池设置为 COGNITO_USER_POOLS 授权方。现在,我的 API 响应中收到“401 未经授权”错误。如何对这些错误进行故障排除?

解决方法

注意:API Gateway 可能会因各种原因返回 401 未经授权错误。以下步骤说明如何对仅与 CONGNITO_USER_POOLS 授权方相关的 401 错误进行故障排除。

检查 API 方法上的授权方配置

1.    在 API Gateway 控制台APIs (API) 窗格中,选择您的 API 的名称。

2.    在左侧导航窗格中,在 API 下选择 Authorizers (授权方)

3.    查看授权方配置并确认满足以下条件:
用户池 ID 与令牌颁布者匹配。
API 已部署。
授权方在测试模式下运行。

有关更多信息,请参阅将 REST API 与 Amazon Cognito 用户池集成

注意:如果在确认 API 方法上的授权方配置后无法调用 API,请检查安全令牌的有效性。

检查安全令牌的有效性

有关更多信息,请参阅如何才能解码和验证 Amazon Cognito JSON Web Token 签名? 当您检查安全令牌的有效性时,请确认满足以下条件:

  • 安全令牌尚未过期。
  • 安全令牌中的颁布者与 API 上配置的 Amazon Cognito 用户池匹配。
  • ID 令牌访问令牌字符串值是有效的。
    注意:如果字符串值有效,则可以解码令牌。如果令牌无效,请确保在请求标头中传递令牌时没有添加任何空格。

重要提示:如果在 API Gateway 方法上没有配置其他范围,请确保您使用的是有效的 ID 令牌。如果在 API Gateway 方法上配置了其他范围,请确认您使用的是有效的访问令牌。有关更多信息,请参阅将 REST API 与 Amazon Cognito 用户池集成

示例安全令牌负载

Id token payload:
 {
 "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
 "aud": "xxxxxxxxxxxxexample",
 "email_verified": true,
 "token_use": "id",
 "auth_time": 1500009400,
 "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
 "cognito:username": "janedoe",
 "exp": 1500013000,
 "given_name": "Jane",
 "iat": 1500009400,
 "email": "janedoe@example.com"
 }
Access token payload:
{
    "auth_time": 1500009400,
    "exp": 1500013000,
    "iat": 1500009400,
    "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
    "scope": "aws.cognito.signin.user.admin",
    "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "token_use": "access",
    "username": "janedoe@example.com"
}

请注意示例安全令牌负载中的以下声明名称:

  • token_use 表示令牌的类型(ID 或访问令牌)。
  • exp 表示令牌的过期时间。
    注意:exp 声明表示为从 Unix 时间戳 (1970-01-01T0:0:0Z) 到以协调世界时 (UTC) 表示的令牌过期日期和时间的秒数。
  • auth_time 表示令牌的颁发时间。
  • iss 表示颁发令牌的用户池所属的域。

重要提示:确保您使用的令牌与在 API Gateway 方法上配置的用户池匹配。如果您仍然无法调用 API,请确认您使用的是正确的授权标头

如果使用 Postman 调用 API

使用 Oauth 2.0 授权模式以直接使用 Amazon Cognito 令牌。设置 Oauth 2.0 授权模式时,请确认满足以下条件:

  • 授权类型授权代码隐式授权,遵循在用户池的应用程序客户端上的配置。
  • 回调 URL 与在用户池的应用程序客户端上配置的重定向 URL 匹配。
  • 身份验证 URL 采用以下格式:
https://mydomain.auth.us-east-1.amazoncognito.com/login

重要提示:mydomain 替换为您配置用户池使用的域名。确保输入托管您的 API 的正确 AWS 区域。

  • 客户端 ID 是用户池的应用程序客户端 ID。
    注意: 如果客户端密钥与用户池的应用程序客户端关联,请确保在 client secret (客户端密钥) 字段的 Authorization (授权) 选项卡中指定客户端密钥。如果用户池的应用程序客户端没有关联的客户端密钥,请将 client secret (客户端密钥) 字段留空。
  • 范围配置为 openid
    注意:用户池的应用程序客户端也必须允许 openid 范围。
  • 授权码流输入了正确的 Amazon Cognito 用户池令牌终端节点。

示例 Amazon Cognito 用户池令牌终端节点

https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token

注意:Postman 可能不会将所需的内容类型传递给令牌终端节点,这会导致 405 错误。但是,您在使用隐式流时不会收到 504 错误。