

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

# 配置外部授权服务器
<a name="ext-auth"></a>

授权服务器是负责对客户端 SDK 和 Agent 进行身份验证和授权的服务器。

默认情况下，Session Manager 将 Broker 作为授权服务器，为客户端 SDK 生成 OAuth 2.0 访问令牌并为 Agent 生成软件声明。如果将 Broker 作为授权服务器，则无需进行额外的配置。

您可以配置 Session Manager 以将 Amazon Cognito 作为外部授权服务器，而不是将 Broker 作为授权服务器。有关 Amazon Cognito 的更多信息，请参阅[《Amazon Cognito 开发人员指南》](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)。

**将 Amazon Cognito 作为授权服务器**

1. 创建一个新的 Amazon Cognito 用户池。有关用户池的更多信息，请参阅《Amazon Cognito 开发人员指南》中的 [Amazon Cognito 的功能](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html#feature-overview)。**

   使用 [create-user-pool](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool.html) 命令，并指定池名称以及要在其中创建池的区域。

   在该示例中，我们将池命名为 `dcv-session-manager-client-app` 并在 `us-east-1` 中创建该池。

   ```
   $ aws cognito-idp create-user-pool --pool-name dcv-session-manager-client-app --region us-east-1
   ```

   示例输出

   ```
   {
       "UserPoolClient": {
           "UserPoolId": "us-east-1_QLEXAMPLE",
           "ClientName": "dcv-session-manager-client-app",
           "ClientId": "15hhd8jij74hf32f24uEXAMPLE",
           "LastModifiedDate": 1602510048.054,
           "CreationDate": 1602510048.054,
           "RefreshTokenValidity": 30,
           "AllowedOAuthFlowsUserPoolClient": false
       }
   }
   ```

   记下 `userPoolId`，您需要在下一步中使用该 ID。

1. 为您的用户池创建一个新的域。使用 [create-user-pool-domain](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-domain.html) 命令，并指定域名以及在上一步中创建的用户池的 `userPoolId`。

   在该示例中，域名为 `mydomain-544fa30f-c0e5-4a02-8d2a-a3761EXAMPLE`，我们在 `us-east-1` 中创建该域。

   ```
   $ aws cognito-idp create-user-pool-domain --domain mydomain-544fa30f-c0e5-4a02-8d2a-a3761EXAMPLE --user-pool-id us-east-1_QLEXAMPLE --region us-east-1
   ```

   示例输出

   ```
   {
       "DomainDescription": {
           "UserPoolId": "us-east-1_QLEXAMPLE",
           "AWSAccountId": "123456789012",
           "Domain": "mydomain-544fa30f-c0e5-4a02-8d2a-a3761EXAMPLE",
           "S3Bucket": "aws-cognito-prod-pdx-assets",
           "CloudFrontDistribution": "dpp0gtexample.cloudfront.net",
           "Version": "20201012133715",
           "Status": "ACTIVE",
           "CustomDomainConfig": {}
       }
   }
   ```

   用户池域的格式如下所示：`https://domain_name.auth.region.amazoncognito.com`。在该示例中，用户池域为 `https://mydomain-544fa30f-c0e5-4a02-8d2a-a3761EXAMPLE.auth.us-east-1.amazoncognito.com`。

1. 创建用户池客户端。使用 [create-user-pool-client](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) 命令，并指定您创建的用户池的 `userPoolId`、客户端的名称以及要在其中创建客户端的区域。此外，还包括 `--generate-secret` 选项以指定您要为创建的用户池客户端生成密钥。

   在该示例中，客户端名称为 `dcv-session-manager-client-app`，我们在 `us-east-1` 区域中创建该客户端。

   ```
   $ aws cognito-idp create-user-pool-client --user-pool-id us-east-1_QLEXAMPLE --client-name dcv-session-manager-client-app --generate-secret --region us-east-1
   ```

   示例输出

   ```
   {
       "UserPoolClient": {
           "UserPoolId": "us-east-1_QLEXAMPLE",
           "ClientName": "dcv-session-manager-client-app",
           "ClientId": "2l9273hp6k2ut5cugg9EXAMPLE",
           "ClientSecret": "1vp5e8nec7cbf4m9me55mbmht91u61hlh0a78rq1qki1lEXAMPLE",
           "LastModifiedDate": 1602510291.498,
           "CreationDate": 1602510291.498,
           "RefreshTokenValidity": 30,
           "AllowedOAuthFlowsUserPoolClient": false
       }
   }
   ```
**注意**  
记下 `ClientId` 和 `ClientSecret`。在开发人员请求用于 API 请求的访问令牌时，您需要为他们提供该信息。

1. 为用户池创建一个新的 OAuth2.0 资源服务器。资源服务器是用于访问受保护的资源的服务器。它处理经过身份验证的访问令牌请求。

   使用 [create-resource-server](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-resource-server.html) 命令，并指定用户池的 `userPoolId`、资源服务器的唯一标识符和名称、范围以及在其中创建资源服务器的区域。

   在该示例中，我们将 `dcv-session-manager` 作为标识符和名称，并将 `sm_scope` 作为范围名称和描述。

   ```
   $ aws cognito-idp create-resource-server --user-pool-id us-east-1_QLEXAMPLE --identifier dcv-session-manager --name dcv-session-manager --scopes ScopeName=sm_scope,ScopeDescription=sm_scope --region us-east-1
   ```

   示例输出

   ```
   {
       "ResourceServer": {
           "UserPoolId": "us-east-1_QLEXAMPLE",
           "Identifier": "dcv-session-manager",
           "Name": "dcv-session-manager",
           "Scopes": [
           {
               "ScopeName": "sm_scope",
               "ScopeDescription": "sm_scope"
           }]
       }
   }
   ```

1. 更新用户池客户端。

   使用 [update-user-pool-client](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html) 命令。指定用户池的 `userPoolId`、用户池客户端的 `ClientId` 以及区域。对于 `--allowed-o-auth-flows`，指定 `client_credentials` 以指示客户端应使用客户端 ID 和客户端密钥组合从令牌终端节点中获取访问令牌。对于 `--allowed-o-auth-scopes`，指定资源服务器标识符和范围名称，如下所示：`resource_server_identifier/scope_name`。包括 `--allowed-o-auth-flows-user-pool-client` 以表示允许客户端在与 Cognito 用户池交互时采用 OAuth 协议。

   ```
   $ aws cognito-idp update-user-pool-client --user-pool-id us-east-1_QLEXAMPLE --client-id 2l9273hp6k2ut5cugg9EXAMPLE --allowed-o-auth-flows client_credentials --allowed-o-auth-scopes dcv-session-manager/sm_scope --allowed-o-auth-flows-user-pool-client --region us-east-1
   ```

   示例输出

   ```
   {
       "UserPoolClient": {
           "UserPoolId": "us-east-1_QLEXAMPLE",
           "ClientName": "dcv-session-manager-client-app",
           "ClientId": "2l9273hp6k2ut5cugg9EXAMPLE",
           "ClientSecret": "1vp5e8nec7cbf4m9me55mbmht91u61hlh0a78rq1qki1lEXAMPLE",
           "LastModifiedDate": 1602512103.099,
           "CreationDate": 1602510291.498,
           "RefreshTokenValidity": 30,
           "AllowedOAuthFlows": [
               "client_credentials"
           ],
           "AllowedOAuthScopes": [
               "dcv-session-manager/sm_scope"
           ],
           "AllowedOAuthFlowsUserPoolClient": true
       }
   }
   ```
**注意**  
用户池现在已准备好提供访问令牌并进行身份验证。在该示例中，授权服务器的 URL 为 `https://cognito-idp.us-east-1.amazonaws.com/us-east-1_QLEXAMPLE/.well-known/jwks.json`。

1. 测试配置。

   ```
   $ curl -H "Authorization: Basic `echo -n 2l9273hp6k2ut5cugg9EXAMPLE:1vp5e8nec7cbf4m9me55mbmht91u61hlh0a78rq1qki1lEXAMPLE | base64`" -H "Content-Type: application/x-www-form-urlencoded" -X POST "https://mydomain-544fa30f-c0e5-4a02-8d2a-a3761EXAMPLE.auth.us-east-1.amazoncognito.com/oauth2/token?grant_type=client_credentials&scope=dcv-session-manager/sm_scope"
   ```

   示例输出

   ```
   {
   "access_token":"eyJraWQiOiJGQ0VaRFpJUUptT3NSaW41MmtqaDdEbTZYb0RnSTQ5b2VUT0cxUUI1Q2VJPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIybDkyNzNocDZrMnV0NWN1Z2c5dWg4ZGx0cCIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiZGN2LXNlc3Npb24tbWFuYWdlclwvcGVybWlzc2lvbnMiLCJhdXRoX3RpbWUiOjE2MDI1MTMyODMsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC51cy13ZXN0LTIuYW1hem9uYXdzLmNvbVwvdXMtd2VzdC0yX1FMZTA3SU9GViIsImV4cCI6MTYwMjUxNjg4MywiaWF0IjoxNjAyNTEzMjgzLCJ2ZXJzaW9uIjoyLCJqdGkiOiIyMDk2YTg4NS04YWQ0LTRmYjgtYjI2Mi1hMmNkNDk0OGZjNjYiLCJjbGllbnRfaWQiOiIybDkyNzNocDZrMnV0NWN1Z2c5dWg4ZGx0cCJ9.ZLZpS4CiiLq1X_VSm911hNT4g8A0FKZXScVJyyV0ijcyOfUOBcpgSMGqJagLYORFuYwLS5c7g4eO04wIwnw21ABGIDcOMElDPCJkrzjfLEPS_eyK3dNmlXDEvdS-Zkfi0HIDsd6audjTXKzHlZGScr6ROdZtId5dThkpEZiSx0YwiiWe9crAlqoazlDcCsUJHIXDtgKW64pSj3-uQQGg1Jv_tyVjhrA4JbD0k67WS2V9NW-uZ7t4zwwaUmOi3KzpBMi54fpVgPaewiVlUm_aS4LUFcWT6hVJjiZF7om7984qb2gOa14iZxpXPBJTZX_gtG9EtvnS9uW0QygTJRNgsw",
   "expires_in":3600,
   "token_type":"Bearer"
   }
   ```

1. 使用 [register-auth-server](register-auth-server.md) 命令注册外部授权服务器以供 Broker 使用。

   ```
   $ sudo -u root dcv-session-manager-broker register-auth-server --url  https://cognito-idp.us-east-1.amazonaws.com/us-east-1_QLEXAMPLE/.well-known/jwks.json
   ```

开发人员现在可以使用服务器请求访问令牌。在请求访问令牌时，请提供此处生成的客户端 ID、客户端密钥和服务器 URL。有关请求访问令牌的更多信息，请参阅《Amazon DCV Session Manager 开发人员指南》中的 [Create get an access token and make an API request](https://docs.aws.amazon.com/dcv/latest/sm-dev/request.html)。**