如何在 API Gateway REST API 上将 Amazon Cognito 用户池设置为授权方?
上次更新日期:2021 年 3 月 30 日
我想在我的 Amazon API Gateway REST API 上设置一个 Amazon Cognito 用户池作为授权方。该如何操作?
简短描述
有两种方法可以在 API Gateway REST API 上将 Amazon Cognito 用户池设置为授权方:
要进行授权,您可以使用 ID 令牌或访问令牌。有关更多信息,请参阅将令牌与用户池结合使用。
注意:要验证 Amazon Cognito 颁发的访问令牌和 ID 令牌中的声明(和其他声明),请使用 Lambda 授权方。如果您使用访问令牌授权 API 方法调用,请确保使用 Amazon Cognito 中的自定义范围授权 API 访问权限。
有关更多信息,请参阅为用户池定义资源服务器和为 REST API 创建 Amazon Cognito 用户池。
解决方法
以下过程说明如何创建 CONGNITO_USER_POOLS 授权方。此示例假设您已创建以下两项:
创建 COGNITO_USER_POOLS 授权方
有关更多信息,请参阅将 REST API 与 Amazon Cognito 用户池集成。
测试新的 COGNITO_USER_POOLS 授权方
创建 COGNITO_USER_POOLS 授权方后,请执行以下操作:
1. 在 API Gateway 控制台中,选择新授权方下的 Test (测试) 按钮。
2. 在 Test (测试) 窗口中,对于 Authorization (授权),输入新 Amazon Cognito 用户池中的 ID token (ID 令牌)。
3. 选择 Test (测试)。
注意:如果 ID 令牌正确,测试将返回 200 响应代码。错误的 ID 令牌返回 401 响应代码。
在 API 方法上配置 COGNITO_USER_POOLS 授权方
获取授权令牌
获取授权令牌有四种方法:
注意:如果您使用 Amazon Cognito 的托管 Web UI 和授权码授权类型,可能需要将获得的代码与令牌终端节点交换。
如果您使用的是隐式授权类型,可以从回调 URL 获得授权。回调 URL 附加了隐式流的访问令牌和 ID 令牌参数。根据您选择使用的令牌类型,确保使用正确的令牌。
使用 Amazon Cognito 的托管 Web UI 获取授权令牌
要使用授权代码授予流程,请执行以下操作:
注意:使用“授权代码授予”流程时,响应类型参数必须为“代码”。
重要提示:将 <your_domain> 替换为用户池的域名。将 <your_app_client_id> 替换为您的用户池的应用程序客户端 ID。将 <your_callback_url> 替换为您的回调 URL。
https://<your_domain>/authorize?response_type=code&client_id=<your_app_client_id>&redirect_uri<your_callback_url>
注意:如果包含 identity_provider 参数,终端节点将重定向到联合身份提供程序。如果仅为 Amazon Cognito 用户池配置了应用程序客户端,则以下终端节点将重定向到 /login 终端节点:
https://<your_domain>/login?response_type=code&client_id=<your_app_client_id>&redirect_uri=<your_callback_url>
2. 登录您的用户池或联合身份提供程序。UI 将重定向到应用程序客户端的回调中指定的 URL。
重要提示:重定向 URL 包括授权代码,需要将授权代码与令牌终端节点进行交换才能获取有效令牌。
3. 向 /oauth2/token 终端节点发送 HTTP POST 请求。有关更多信息,请参阅令牌终端节点。
HTTP POST 请求示例
注意:以下示例 HTTP Post 请求使用下面的 /oauth2/token 终端节点:https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=authorization_code&
client_id=djc98u3jiedmi283eu928&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect
HTTP Post 请求响应示例
HTTP/1.1 200 OKContent-Type: application/json
{
"access_token":"eyJz9sdfsdfsdfsd",
"refresh_token":"dn43ud8uj32nk2je",
"id_token":"dmcxd329ujdmkemkd349r",
"token_type":"Bearer",
"expires_in":3600
}
要使用隐式授权流程,请执行以下操作:
注意:使用隐式授权流程时,响应类型参数必须为“令牌”。
重要提示:将 <your_domain> 替换为用户池的域名。将 <your_app_client_id> 替换为您的用户池的应用程序客户端 ID。将 <your_callback_url> 替换为您的回调 URL。
https://<your_domain>/authorize?response_type=token&client_id=<your_app_client_id> &redirect_uri=<your_callback_url>
注意:如果包含 identity_provider 参数,终端节点将重定向到联合身份提供程序。如果仅为 Amazon Cognito 用户池配置了应用程序客户端,则以下终端节点将重定向到 /login 终端节点:
https://<your_domain>/login?response_type=token&client_id=<your_app_client_id> &redirect_uri=<your_callback_url>
2. 使用现有用户的用户名和密码登录您的用户池,或创建新用户用于登录。UI 将重定向到应用程序客户端的回调中指定的 URL。
注意:重定向 URL 中包括 ID 令牌和访问令牌。
重定向 URL 示例
https://www.example.com/#id_token=123456789idtoken123456789&access_token=123456789accesstoken123456789expires_in=3600&token_type=Bearer
使用 AWS CLI 获取授权令牌
注意:如果您在运行 AWS CLI 命令时遇到错误,请确保您运行的是最新版本的 AWS CLI。
运行以下 initiate-auth AWS CLI 命令:
重要提示:将以下值替换为您正在使用的输入:auth-flow、--client-id 和 --auth-parameters
aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=testuser,PASSWORD=P@ssw0rd --client-id <app client id>
initiate-auth AWS CLI 命令响应示例
Response: {
"AuthenticationResult": {
"ExpiresIn": 3600,
"IdToken": "dmcxd329ujdmkemkd349r",
"RefreshToken": "dn43ud8uj32nk2je"",
"TokenType": "Bearer",
"AccessToken": "eyJz9sdfsdfsdfsd"
},
"ChallengeParameters":
{}
}
使用其中一个 AWS 开发工具包获取授权令牌
有关更多信息,请参阅将 Amazon Cognito 与 Web 和移动应用程序集成。
使用 Postman 获取授权令牌
使用 Postman 中的 Oauth 2.0 授权模式获取授权令牌。有关更多信息,请参阅设置 Amazon Cognito 用户池后,如何对来自 API Gateway REST API 终端节点的 401 未授权错误进行故障排除?