

AWS 大型机现代化服务（托管运行时环境体验）不再向新客户开放。有关类似于 AWS 大型机现代化服务（托管运行时环境体验）的功能，请浏览 AWS 大型机现代化服务（自我管理体验）。现有客户可以继续正常使用该服务。有关更多信息，请参阅[AWS 大型机现代化可用性变更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon Cognito 配置 Gapwalk OAuth2 身份验证
<a name="ba-runtime-auth-cognito"></a>

本主题介绍如何使用 Amazon Cognito 作为 OAuth2 身份提供者 (IdP)，为 Gapwalk 应用程序配置身份验证。

## 先决条件
<a name="ba-runtime-auth-cognito-prereq"></a>

在本教程中，我们将使用 Amazon Cognito 作为 IdP 和 PlanetDemo 现代化项目。

您可以使用任何其他外部身份提供者。这些 ClientRegistration 信息必须从您的 IdP 处获取，并且是 Gapwalk 身份验证所必需的。有关更多信息，请参阅《[Amazon Cognito 开发人员指南](https://docs.aws.amazon.com/cognito/latest/developerguide/)》。

** ClientRegistration 信息：**

client-id  
 ClientRegistration 的 ID。在我们的示例中，它将是 PlanetsDemo。

client-secret  
您的客户端密钥。

授权端点  
授权服务器的授权端点 URI。

令牌端点  
授权服务器的令牌端点 URI。

jwks 端点  
用于获取 JSON Web 密钥（JWK）的 URI，其中包含用于验证授权服务器颁发的 JSON Web 签名的密钥。

重定向 URI  
授权服务器将最终用户（如果授予了访问权限）重定向到的 URI。

## Amazon Cognito 设置
<a name="cog-setup"></a>

首先，我们将创建和配置一个 Amazon Cognito 用户池和用户，并将其与已部署的 Gapwalk 应用程序用于进行测试。

**注意**  
如果您使用其他 IdP，则可以跳过此步骤。

**创建用户池**

1. 前往中的 Amazon Cognito AWS 管理控制台 并使用您的 AWS 凭证进行身份验证。

1. 选择**用户池**。

1. 选择**创建用户池**。

1. 在**配置登录体验**中，保持 **Cognito 用户池**的默认提供者类型。您可以选择一个或多个 **Cognito 用户池登录选项**；现在，选择**用户名**，然后选择**下一步**。  
![alt_text](http://docs.aws.amazon.com/zh_cn/m2/latest/userguide/images/cog-auth-provider.png)

1. 在**配置安全要求**中，保留默认设置并通过选择**无 MFA** 来禁用**多重身份验证**，然后选择**下一步**。  
![alt_text](http://docs.aws.amazon.com/zh_cn/m2/latest/userguide/images/cog-sec-requirements.png)

1. 作为安全措施，请禁用**启用自动注册**，然后选择**下一步**。  
![alt_text](http://docs.aws.amazon.com/zh_cn/m2/latest/userguide/images/cog-config-sign-up.png)

1. 选择**使用 Cognito 发送电子邮件**，然后选择**下一步**。  
![alt_text](http://docs.aws.amazon.com/zh_cn/m2/latest/userguide/images/cog-email.png)

1. 在**集成应用程序**中，为您的用户池指定一个名称。在**托管身份验证页面**中，选择**使用 Cognito 托管 UI**。  
![alt_text](http://docs.aws.amazon.com/zh_cn/m2/latest/userguide/images/cog-domain.png)

1. 为简单起见，在**域**中，选择**使用 Cognito 域**并输入域前缀；例如，`https://planetsdemo`。必须将演示应用程序添加为客户端。

   1. 在**初始应用程序客户端**中，选择**机密客户端**。输入应用程序客户端名称（例如 **planetsdemo**），然后选择**生成客户端密钥**。

   1. 在**支持的回调 URL** 中，输入用户在通过身份验证后要重定向到的 URL。该 URL 必须以 `/login/oauth2/code/cognito` 结尾。例如，对于我们的应用程序和后端 Gapwalk 和 BAC 应用程序：

      ```
      http://localhost:8080/bac
            http://localhost:8080/bac/login/oauth2/code/cognito
            http://localhost:8080/gapwalk-application
            http://localhost:8080/gapwalk-application/login/oauth2/code/cognito
            http://localhost:8080/planetsdemo
            http://localhost:8080/planetsdemo/login/oauth2/code/cognito
      ```

      您可以稍后编辑该 URL。  
![alt_text](http://docs.aws.amazon.com/zh_cn/m2/latest/userguide/images/cog-urls.png)

   1. 在 “**允许注销”** 中， URLs输入您希望 Amazon Cognito 在应用程序注销用户时重定向到的注销页面的 URL。例如，对于后端 Gapwalk 和 BAC 应用程序：

      ```
      http://localhost:8080/bac/logout
      http://localhost:8080/gapwalk-application/logout
      http://localhost:8080/planetsdemo/logout
      ```

      您可以稍后编辑该 URL。

   1. 在**高级应用程序客户端设置**和**属性读写权限**部分中保留默认值。

   1. 选择**下一步**。

1. 在**检查并创建**中，验证您的选择，然后选择**创建用户池**。

有关更多信息，请参阅[创建用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html)。

**创建用户**

鉴于自助注册已禁用，请创建一个 Amazon Cognito 用户。导航到 AWS 管理控制台中的 Amazon Cognito。选择您创建的用户池，然后在**用户**中，选择**创建用户**。

在**用户信息**中，选择**发送电子邮件邀请**，输入用户名和电子邮件地址，然后选择**生成密码**。选择**创建用户**。

**创建角色**

在**群组**选项卡中，创建 3 个群组（SUPER\_ADMIN、ADMIN 和 USER），并将您的用户关联到其中一个或多个群组。Gapwalk 应用程序稍后会将这些角色映射到 ROLE\_SUPER\_ADMIN、ROLE\_ADMIN 和 ROLE\_USER，从而可以访问一些受限制的 API REST 调用。

该应用程序实现了与多个 OAuth2 身份提供商配合使用的分层 scope-to-role映射。当使用 Cognito 发行的 JWT 令牌进行资源服务器授权时，令牌中定义的作用域会自动映射到相应的角色。

## 将 Amazon Cognito 集成到 Gapwalk 应用程序中
<a name="integrate-cognito"></a>

在您的 Amazon Cognito 用户池和用户准备就绪后，请访问您的经过现代化改造的应用程序的 `application-main.yml` 文件并添加以下代码：

```
gapwalk-application.security: enabled
gapwalk-application.security.identity: oauth
gapwalk-application.security.issuerUri: https://cognito-idp.<region-id>.amazonaws.com/<pool-id>
gapwalk-application.security.domainName: <your-cognito-domain>

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            client-id: <client-id>
            client-name: <client-name>
            client-secret: <client-secret>
            provider: cognito
            authorization-grant-type: authorization_code
            scope: openid
            redirect-uri: "<redirect-uri>"
        provider:
          cognito:
            issuer-uri: ${gapwalk-application.security.issuerUri}
            authorization-uri: ${gapwalk-application.security.domainName}/oauth2/authorize
            jwk-set-uri: ${gapwalk-application.security.issuerUri}/.well-known/jwks.json
            token-uri: ${gapwalk-application.security.domainName}/oauth2/token
            user-name-attribute: username
      resourceserver:
        jwt:
          jwk-set-uri: ${gapwalk-application.security.issuerUri}/.well-known/jwks.json
```

按如下所述替换以下占位符：

1. 前往中的 Amazon Cognito AWS 管理控制台 并使用您的 AWS 凭证进行身份验证。

1. 选择**用户池**，然后选择您创建的用户池。你可以在**用户池 ID {{pool-id}}** 中找到。

1. 选择**应用程序集成**，在那里你可以找到你的{{your-cognito-domain}}，然后前往**应用程序客户端和分析**并选择你的应用程序。

1. 在 **App 客户端：YouRapp** 中，你可以找到{{client-name}}{{client-id}}、和{{client-secret}}（**显示客户端密钥**）。

1. {{region-id}}对应于您在其中创建 Amazon Cognito 用户和用户池的 AWS 区域 ID。示例：`eu-west-3`。

1. {{redirect-uri}}输入您为 “**允许的回传 URL” 指定的 UR** I。在我们的示例中，该 URI 为 `http://localhost:8080/planetsdemo/login/oauth2/code/cognito`。

您可以立即部署 Gapwalk 应用程序，并使用之前创建的用户登录您的应用程序。