

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Prácticas recomendadas de multitenencia con ámbito personalizado
<a name="scope-based-multi-tenancy"></a>

[Amazon Cognito admite ámbitos OAuth 2.0 personalizados para servidores de recursos.](cognito-user-pools-define-resource-servers.md) Puede implementar la multitenencia de clientes de aplicaciones en grupos de usuarios para modelos de autorización machine-to-machine (M2M) con ámbitos personalizados. La multitenencia basada en el ámbito reduce el esfuerzo necesario para implementar la multitenencia de M2M definiendo el acceso en el cliente de aplicación o en la configuración de la aplicación.

 En el siguiente diagrama, se muestra una opción de multitenencia con ámbito personalizado. Muestra cada inquilino con un cliente de aplicación dedicado que tiene acceso a los ámbitos relevantes de un grupo de usuarios.

![\[Diagrama que ilustra el flujo de ámbitos personalizados en una arquitectura de varios inquilinos.\]](http://docs.aws.amazon.com/es_es/cognito/latest/developerguide/images/multi-tenancy-custom-scope.png)


**Cuándo implementar la multitenencia con ámbitos personalizados**  
 Cuando se utiliza una autorización de M2M con credenciales de cliente en un cliente confidencial. Como práctica recomendada, cree servidores de recursos que sean exclusivos para un cliente de aplicación. La multitenencia con ámbitos personalizados puede depender de la *solicitud* o del *cliente*.

**Dependiente de la solicitud**  
 Implemente la lógica de la aplicación para solicitar solo los ámbitos que coincidan con los requisitos del inquilino. Por ejemplo, un cliente de aplicación podría conceder acceso de lectura y escritura a las API A y B, pero la aplicación A del inquilino solo solicita el ámbito de lectura de la API A y el ámbito que indica la tenencia. Este modelo permite combinaciones más complejas de ámbitos compartidos entre inquilinos.

**Dependiente del cliente**  
 Solicite todos los ámbitos asignados a un cliente de aplicación en las solicitudes de autorización. Para ello, omita el parámetro de solicitud `scope` en la solicitud al [Punto de conexión de token](token-endpoint.md). Este modelo permite a los clientes de aplicación almacenar los indicadores de acceso que desee añadir a los ámbitos personalizados.

 En cualquier caso, las aplicaciones reciben tokens de acceso con ámbitos que indican sus privilegios en relación con los orígenes de datos de los que dependen. Los ámbitos también pueden presentar otro tipo de información a la aplicación, como:
+ Designar tenencias
+ Contribuir al registro de solicitudes
+ Indique APIs que la aplicación está autorizada a realizar consultas
+ Informar de las comprobaciones iniciales a los clientes activos

**Nivel de esfuerzo**  
 La multitenencia personalizada requiere un nivel de esfuerzo variable en relación con la escala de la aplicación. Debe diseñar una lógica de aplicación que permita a las aplicaciones analizar los tokens de acceso y presentar las solicitudes de API adecuadas.

 Por ejemplo, el ámbito de un servidor de recursos viene con el formato `[resource server identifier]/[name]`. Es poco probable que el identificador del servidor de recursos sea relevante para la decisión de autorización del ámbito del inquilino, por lo que es necesario analizar el nombre del ámbito de forma coherente.

## Ejemplo de recurso
<a name="scope-based-multi-tenancy-example"></a>

 La siguiente AWS CloudFormation plantilla crea un grupo de usuarios para la multitenencia de ámbito personalizado con un servidor de recursos y un cliente de aplicaciones.

```
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"
```