

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 外部認可サーバーの設定
<a name="ext-auth"></a>

認可サーバーとは、クライアント SDK とエージェントの認証および認可を行うサーバーです。

セッションマネージャーでは、デフォルトで、ブローカーを認可サーバーとして使用して、クライアント SDK の OAuth 2.0 アクセストークンと、エージェント用のソフトウェアステートメントを生成します。ブローカーを認可サーバーとして使用する場合、追加の設定は必要ありません。

外部認可サーバーとしてブローカーではなく 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)」を参照してください。

   [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. ユーザープール用の新しい OAuth 2.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` の場合、クライアント ID とクライアントシークレットを併用することで、クライアントがトークンエンドポイントからアクセストークンを取得することを示すために `client_credentials` を指定します。`--allowed-o-auth-scopes` の場合、リソースサーバー識別子とスコープ名として `resource_server_identifier/scope_name` を指定します。クライアントが Cognito ユーザープールとの通信時に OAuth プロトコルに従うことを許可されていることを示すために `--allowed-o-auth-flows-user-pool-client` を含めます。

   ```
   $ 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 セッションマネージャーデベロッパーガイド*」の「[アクセストークンを取得して API リクエストを行う](https://docs.aws.amazon.com/dcv/latest/sm-dev/request.html)」を参照してください。