在设置 Amazon Cognito 用户群体后,如何对 API Gateway REST API 端点的“401 未经授权”错误进行故障排除?
上次更新日期:2022 年 8 月 18 日
我在 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,请检查安全令牌的有效性。
检查安全令牌的有效性
当您检查安全令牌的有效性时,请确认满足以下条件:
- 安全令牌尚未过期。
- 安全令牌中的颁布者与 API 上配置的 Amazon Cognito 用户池匹配。
- ID 令牌和访问令牌字符串值是有效的。
注意:如果字符串值有效,则可以解码令牌。如果令牌无效,请确保在请求标头中传递令牌时没有添加任何空格。
重要提示:如果在 API Gateway 方法上没有配置其他范围,请确保您使用的是有效的 ID 令牌。如果在 API Gateway 方法上配置了其他范围,请确认您使用的是有效的访问令牌。有关更多信息,请参阅将 REST API 与 Amazon Cognito 用户群体集成以及在 API Gateway 中使用 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,请确认您使用的是正确的授权标头。
- 如果您仍然收到 401 错误,请确保您的资源策略未阻止请求。
如果使用 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 错误。