我想在 Amazon Cognito 用户池中使用自定义作用域授予对 Amazon API Gateway API 资源的访问权限。
简短描述
在您的 Amazon Cognito 用户池中定义具有自定义作用域的资源服务器。然后,为您的 API Gateway API 创建和配置 Amazon Cognito 授权程序,以对您的 API 资源请求进行身份验证。
如果您有不同的应用程序客户端,需要对您的 API 资源提供不同级别的访问权限,则可以定义不同的访问作用域。考虑不同的应用程序客户端可能需要的精细访问级别,然后进行相应的设计。
解决方法
创建以下先决条件:
在用户池中添加具有自定义作用域的资源服务器
1. 打开 Amazon Cognito 控制台。
2. 定义资源服务器和自定义作用域。
3. 创建资源服务器后,选择应用程序集成选项卡。
4. 在应用程序客户端和分析部分中,选择您的应用程序客户端。
5. 从托管用户界面部分,选择编辑。然后,完成以下步骤:
在 OAuth 2.0 授权类型下拉列表中,选择隐式授权。
在自定义作用域下拉列表中,选择您定义的自定义作用域。
**注意:**自定义作用域的格式为 resourceServerIdentifier/scopeName。当客户端在 OAuth 2.0 流程中请求自定义作用域时,请求必须包含此格式的作用域的完整标识符。
6. 选择保存更改。
如果您的移动应用程序有服务器端组件,那么请使用授权码授权流程和代码交换证明密钥(PKCE)。通过授权码授权流程,令牌更加安全,并且永远不会直接暴露给最终用户。
如果您的设置不包含任何服务器端逻辑,则可以使用隐式授权流程。隐式授权不会生成刷新令牌。这样可以防止刷新令牌暴露给客户端。刷新令牌的有效期更长,可以检索较新的 ID 和访问令牌。
**重要说明:**不要将刷新令牌存储在客户端环境中。
有关详细信息,请参阅应用程序客户端设置术语。有关 Amazon Cognito 用户池 OAuth 2.0 授权的详细信息,请参阅了解 Amazon Cognito 用户池 OAuth 2.0 授权。
创建授权程序并将其与您的 API 集成
要完成以下步骤,请按照说明将 REST API 与 Amazon Cognito 用户池集成。
1. 要创建授权者,请按照使用 API Gateway 控制台创建 COGNITO_USER_POOLS 授权程序下的说明进行操作。
注意:创建后,控制台中会出现一个用于测试您的授权程序的选项。这需要身份令牌。要使用访问令牌在控制台之外测试您的设置,请参阅本文中的获取用户池访问令牌以进行测试部分。
2. 要将授权程序与您的 API 集成,请按照在方法上配置 COGNITO_USER_POOLS 授权程序。
**注意:**对于 OAuth 作用域,以 resourceServerIdentifier/scopeName 格式输入自定义作用域的完整标识符。
3. 部署 API。
获取用户池访问令牌以进行测试
使用用户池的托管 Web 用户界面登录,并从 Amazon Cognito 授权服务器检索访问令牌。或者,使用移动和 web AWS SDK 中提供的 OAuth 2.0 端点实施来检索访问令牌。
**注意:**当应用程序客户端通过托管的 Web 用户界面请求身份验证时,该请求可以包括系统预留作用域或自定义作用域的任意组合。如果客户端不请求任何作用域,则身份验证服务器会返回一个访问令牌,其中包含与该客户端关联的所有作用域。在设计应用程序客户端时,请确保客户端在请求中包含预期的作用域,以避免授予不必要的权限。
1. 在 Web 浏览器中输入以下 URL:
https://yourDomainPrefix.auth.region.amazoncognito.com/login?response_type=token&client_id=yourClientId&redirect_uri=redirectUrl
注意:将 yourDomainPrefix 和 region 替换为您的用户池的值。可在 Amazon Cognito 控制台上的用户池域名选项卡上找到它们。
将 yourClientId 替换为应用程序客户端的 ID,并将 redirectUrl 替换为应用程序客户端的回拨 URL。可在控制台用户池的应用程序客户端设置选项卡上找到它们。有关详细信息,请参阅登录端点。
2. 以您所创建用户的身份登录您的用户池。
3. 从地址栏的 URL 中复制访问令牌。令牌是 access_token= 之后的一长串字符。
调用您的 API 作为测试
作为测试,使用访问令牌作为授权标头的值,使用访问令牌调用您的 API。您可以使用 Postman 应用程序(位于 Postman 网站上),也可以使用命令行界面中的 curl 命令。有关 curl 的详细信息,请参阅 curl 项目网站。
要使用 curl,请运行以下命令:
curl https://restApiId.execute-api.region.amazonaws.com/stageName/resourceName -H "Authorization: accessToken"
**注意:**将 restApiId 替换为 API ID。将 region 替换为 API 的 AWS 区域。将 stageName 替换为部署您的 API 的阶段的名称。将 resourceName 替换为 API 资源的名称。将 accessToken 替换为所复制的令牌。有关详细信息,请参阅在 Amazon API Gateway 中调用 REST API。
正确配置所有内容后,您将获得一个 200 OK 的响应代码。
相关信息
配置用户池应用程序客户端
访问令牌作用域(OAuth 2.0 授权框架)