

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

# カスタムスコープマルチテナンシーのベストプラクティス
<a name="scope-based-multi-tenancy"></a>

Amazon Cognito は、[リソースサーバー](cognito-user-pools-define-resource-servers.md)用のカスタム OAuth 2.0 スコープをサポートしています。カスタムスコープを使用して、Machine to Machine (M2M) 認可モデル用のユーザープールにアプリケーションクライアントのマルチテナンシーを実装できます。スコープベースのマルチテナンシーでは、アプリケーションクライアントまたはアプリケーション設定でアクセスを定義することで M2M マルチテナンシーの実装に必要な労力が削減されます。

 次の図は、カスタムスコープのマルチテナンシーのオプションを 1 つ示しています。ユーザープール内の関連スコープにアクセスできる専用アプリケーションクライアントを持つ各テナントを示しています。

![\[マルチテナントアーキテクチャのカスタムスコープのフローを示す図。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/multi-tenancy-custom-scope.png)


**カスタムスコープのマルチテナンシーを実装するタイミング**  
 使用について、機密クライアントのクライアント認証情報による M2M 認証がなされるとき。ベストプラクティスとして、アプリケーションクライアント専用のリソースサーバーを作成します。カスタムスコープのマルチテナンシーは、*リクエスト依存*または*クライアント依存*にすることができます。

**リクエスト依存**  
 テナントの要件に一致するスコープのみをリクエストするアプリケーションロジックを実装します。例えば、アプリケーションクライアントで API A と API B への読み取りと書き込みのアクセスを発行できる場合であっても、テナントアプリケーション A が API A の読み取りスコープとテナンシーを示すスコープのみをリクエストするというものです。このモデルにより、テナント間の共有スコープについて、複雑性の高い組み合わせが可能になります。

**クライアント依存**  
 認可リクエストでアプリケーションクライアントに割り当てられたすべてのスコープをリクエストします。これを行うには、[トークンエンドポイント](token-endpoint.md) へのリクエストにおける `scope` リクエストパラメータを除外します。このモデルにより、アプリケーションクライアントは、カスタムスコープに追加するアクセスインジケーターを保存できます。

 いずれの場合も、アプリケーションは、依存するデータソースの権限を示すスコープを持つアクセストークンを受け取ります。また、スコープは、アプリケーションに他の情報を提示することもできます。
+ テナンシーを指定する
+ リクエストログに役立つ
+ アプリケーションがクエリを許可されている API を示す
+ アクティブな顧客の初期チェックに情報を提供する

**労力レベル**  
 カスタムスコープのマルチテナンシーには、アプリケーションの規模に応じてさまざまなレベルの労力が必要になります。アプリケーションがアクセストークンを解析し、適切な API リクエストを実行できるようにするアプリケーションロジックを考案する必要があります。

 例えば、リソースサーバースコープは `[resource server identifier]/[name]` の形式で指定されます。リソースサーバー識別子は、テナントスコープからの認可に関する決定に関連している可能性が低く、スコープ名を一貫して解析する必要があります。

## リソースの例
<a name="scope-based-multi-tenancy-example"></a>

 次の AWS CloudFormation テンプレートは、1 つのリソースサーバーとアプリケーションクライアントを使用して、カスタムスコープのマルチテナンシー用のユーザープールを作成します。

```
AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template illustrating scope-based multi-tenancy
Resources:
  MyUserPool:
    Type: "AWS::Cognito::UserPool"
  MyUserPoolDomain:
    Type: AWS::Cognito::UserPoolDomain
    Properties:
      UserPoolId: !Ref MyUserPool
      # Note that the value for "Domain" must be unique across all of AWS.
      # In production, you may want to consider using a custom domain.
      # See: https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-add-custom-domain.html#cognito-user-pools-add-custom-domain-adding
      Domain: !Sub "example-userpool-domain-${AWS::AccountId}"
  MyUserPoolResourceServer:
    Type: "AWS::Cognito::UserPoolResourceServer"
    Properties:
      Identifier: resource1
      Name: resource1
      Scopes:
        - ScopeDescription: Read-only access
          ScopeName: readScope
      UserPoolId: !Ref MyUserPool
  MyUserPoolTenantBatch1ResourceServer:
    Type: "AWS::Cognito::UserPoolResourceServer"
    Properties:
      Identifier: TenantBatch1
      Name: TenantBatch1
      Scopes:
        - ScopeDescription: tenant1 identifier
          ScopeName: tenant1
        - ScopeDescription: tenant2 identifier
          ScopeName: tenant2
      UserPoolId: !Ref MyUserPool
  MyUserPoolClientTenant1:
    Type: "AWS::Cognito::UserPoolClient"
    Properties:
      AllowedOAuthFlows:
        - client_credentials
      AllowedOAuthFlowsUserPoolClient: true
      AllowedOAuthScopes:
        - !Sub "${MyUserPoolTenantBatch1ResourceServer}/tenant1"
        - !Sub "${MyUserPoolResourceServer}/readScope"
      GenerateSecret: true
      UserPoolId: !Ref MyUserPool
Outputs:
  UserPoolClientId:
    Description: User pool client ID
    Value: !Ref MyUserPoolClientTenant1
  UserPoolDomain:
    Description: User pool domain
    Value: !Sub "https://${MyUserPoolDomain}.auth.${AWS::Region}.amazoncognito.com"
```