

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定外部授權伺服器
<a name="ext-auth"></a>

授權伺服器是負責驗證和授權用戶端 SDKs 和 代理程式的伺服器。

依預設，Session Manager 會使用中介裝置做為授權伺服器，為用戶端 SDK 產生 OAuth 2.0 存取字符，並為 代理程式產生軟體陳述式。 SDKs 如果您使用中介裝置做為授權伺服器，則不需要額外的組態。

您可以設定 Session Manager 使用 Amazon Cognito 做為外部授權伺服器，而非中介裝置。如需 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)。 *Amazon Cognito *

   使用 [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`，您將在下一個步驟中使用它。

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)命令註冊要與代理程式搭配使用的外部授權伺服器。

   ```
   $ 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 開發人員指南*》中的[建立取得存取權杖和提出 API 請求](https://docs.aws.amazon.com/dcv/latest/sm-dev/request.html)。