如何在 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 授权方

有关更多信息,请参阅 将 REST API 与 Amazon Cognito 用户池集成中的 在方法上配置 COGNITO_USER_POOLS 授权方部分。

获取授权令牌

获取授权令牌有四种方法:

注意:如果您使用 Amazon Cognito 的托管 Web UI 和授权码授权类型,可能需要将获得的代码与令牌终端节点交换。

如果您使用的是隐式授权类型,可以从回调 URL 获得授权。回调 URL 附加了隐式流的访问令牌和 ID 令牌参数。根据您选择使用的令牌类型,确保使用正确的令牌。

使用 Amazon Cognito 的托管 Web UI 获取授权令牌

要使用授权代码授予流程,请执行以下操作:

注意:使用“授权代码授予”流程时,响应类型参数必须为“代码”

1.    向以下 URL 发送 HTTP GET 请求

重要提示:<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
}

要使用隐式授权流程,请执行以下操作:

注意:使用隐式授权流程时,响应类型参数必须为“令牌”

1.    向以下 URL 发送 HTTP GET 请求: 

重要提示:<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 未授权错误进行故障排除?