跳至内容

设置 Amazon Cognito 用户池后如何对来自 API Gateway REST API 端点的“401 Unauthorized”错误进行故障排除?

2 分钟阅读
0

我在我的 Amazon API Gateway REST API 上将我的 Amazon Cognito 用户池设置为 COGNITO_USER_POOLS 授权者。我在 API 响应中收到“401 Unauthorized”错误。

解决方法

**注意:**出于各种原因,API Gateway 可能会返回 401 Unauthorized 错误。以下过程显示如何仅解决与 COGNITO_USER_POOLS 授权者相关的 401 错误。

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

完成以下步骤:

  1. 打开 API Gateway 控制台
  2. 在导航窗格中,选择 APIs,然后选择您的 API。
  3. 在导航窗格中,在您的 API 下选择 Authorizers(授权者)。
  4. 查看授权者的配置并确认以下内容是否属实:
    用户池 ID 与令牌的颁发者相匹配。
    您已部署 API。
    授权者对 ID 令牌以测试模式运行。
    **注意:**您不能使用此功能来测试访问令牌。

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

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

检查安全令牌的有效性

要检查安全令牌的有效性,请确认以下内容是否属实:

  • 安全令牌未过期。
  • 安全令牌中的颁发者与在 API 上配置的 Amazon Cognito 用户池相匹配。
  • ID 令牌访问令牌字符串值有效。
    **注意:**如果字符串值有效,则可以对令牌进行解码。如果令牌无效,请查看您的令牌。确保令牌在通过请求标头时没有任何额外的空格。

重要事项:如果您未在 API Gateway 方法上配置任何范围,请确保使用有效的 ID 令牌。如果您在 API Gateway 方法上配置其他范围,请确保使用有效的访问令牌。有关详细信息,请参阅如何在 Amazon Cognito 中使用自定义作用域授予对 API Gateway API 的访问权限?

安全令牌有效载荷示例:

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 epoch (1970-01-01T0:0:0Z) 到令牌过期日期和时间(协调世界时,UTC)的秒数。
  • auth_time 表示令牌的颁发时间。
  • iss 表示颁发令牌的用户池的域。

**重要事项:**您使用的令牌必须与您在 API Gateway 方法上配置的用户池相匹配。如果您无法调用 API,请确认您是否正确使用授权标头。如果您收到 401 错误,请确保您的资源策略未阻止该请求。

如果您使用 Postman 调用 API

要直接使用 Amazon Cognito 令牌,请使用 OAuth 2.0 授权模式。有关详细信息,请参阅 Postman 网站上的 API authentication and authorization in Postman(Postman 中的 API 身份验证和授权)

当您设置 OAuth 2.0 授权模式时,请确认以下内容是否属实:

  • Grant type(授权类型)选项设置为 Authorization code(授权代码)或 Authorization implicit(隐式授权)。
  • Callback URL(回调 URL)与用户池应用程序客户端上配置的 Redirected URL(重定向 URL)相匹配。
  • Auth URL(身份验证 URL)采用以下格式:https://mydomain.auth.us-east-1.amazoncognito.com/login
    **注意:**请将 mydomain 替换为用于配置用户池的域名。确保输入托管 API 的正确 AWS 区域。
  • Client ID(客户端 ID)是用户池的应用程序客户端 ID。
    **注意:**如果您将客户端密钥与用户池的应用程序客户端相关联,请在 Authorization(授权)选项卡中指定该密钥。如果没有与用户池的应用程序客户端关联的客户端密钥,请将 Client secret(客户端密钥)字段留空。
  • Scope(范围)配置为 Openid
    **注意:**您必须在用户池的应用程序客户端上允许 Openid 范围。
  • 对于 Authorization code flow(授权代码流),请输入正确的 Amazon Cognito 用户池令牌端点。
    Amazon Cognito 用户池令牌端点示例:
    https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token

**注意:**如果令牌端点不支持内容类型,Postman 将无法传递所需的内容并会导致 405 错误。要避免此问题,请使用隐式流。有关详细信息,请参阅 OAuth 2.0 授权

相关信息

Secure API access with Amazon Cognito federated identities, Amazon Cognito user pools, and API Gateway(使用 Amazon Cognito 联合身份、Amazon Cognito 用户池和 Amazon API Gateway 保护 API 访问)

如何解码和验证 Amazon Cognito JSON Web 令牌的签名?

使用 Amazon Cognito 用户池作为授权方控制对 REST API 的访问