我在 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 错误。
相关信息
使用 Amazon Cognito 联合身份、Amazon Cognito 用户池和 Amazon API Gateway 保护 API 访问
如何才能解码和验证 Amazon Cognito JSON Web Token 签名?
以授权方身份使用 Amazon Cognito 用户池控制对 REST API 的访问