Bonnes pratiques en matière de mutualisation sur mesure - Amazon Cognito

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Bonnes pratiques en matière de mutualisation sur mesure

Amazon Cognito prend en charge les étendues OAuth 2.0 personnalisées pour les serveurs de ressources. Vous pouvez implémenter la mutualisation des clients d'applications dans les groupes d'utilisateurs pour les modèles d'autorisation machine-to-machine (M2M) avec des étendues personnalisées. La mutualisation basée sur le périmètre réduit les efforts nécessaires à la mise en œuvre de la mutualisation M2M en définissant l'accès dans le client de votre application ou dans la configuration de l'application.

Note

Actuellement, vous ne pouvez pas personnaliser les jetons d'accès pour ajouter des revendications ou des étendues personnalisées dans les flux d'autorisation des informations d'identification des clients (M2M).

Le schéma suivant illustre une option pour la mutualisation d'une portée personnalisée. Il montre à chaque locataire un client d'application dédié qui a accès aux étendues pertinentes d'un pool d'utilisateurs.

Schéma illustrant le flux des étendues personnalisées dans une architecture à locataires multiples.
Quand mettre en œuvre la mutualisation personnalisée

Lorsque vous utilisez une autorisation M2M avec les informations d'identification du client dans un client confidentiel. Il est recommandé de créer des serveurs de ressources exclusifs à un client d'application. La mutualisation à périmètre personnalisé peut dépendre de la demande ou du client.

En fonction de la demande

Mettez en œuvre une logique d'application pour ne demander que les étendues correspondant aux exigences de votre locataire. Par exemple, un client d'application peut être en mesure de délivrer un accès en lecture et en écriture à API A et API B, mais l'application cliente A demande uniquement l'étendue de lecture pour API A et la portée indiquant la location. Ce modèle permet des combinaisons plus complexes d'étendues partagées entre les locataires.

Dépendant du client

Demandez toutes les étendues attribuées à un client d'application dans vos demandes d'autorisation. Pour ce faire, omettez le paramètre de scope requête dans votre demande adressée auPoint de terminaison de jeton. Ce modèle permet aux clients de l'application de stocker les indicateurs d'accès que vous souhaitez ajouter à vos étendues personnalisées.

Dans les deux cas, vos applications reçoivent des jetons d'accès dont les étendues indiquent leurs privilèges pour les sources de données dont elles dépendent. Les scopes peuvent également présenter d'autres informations à votre application :

  • Désigner le bail

  • Contribuer à l'enregistrement des demandes

  • Indiquez APIs que l'application est autorisée à interroger

  • Indiquez les vérifications initiales pour les clients actifs.

Niveau d'effort

La mutualisation sur mesure nécessite un niveau d'effort variable en fonction de l'échelle de votre application. Vous devez concevoir une logique d'application qui permette à vos applications d'analyser les jetons d'accès et de faire les API demandes appropriées.

Par exemple, l'étendue d'un serveur de ressources est disponible au format[resource server identifier]/[name]. Il est peu probable que l'identifiant du serveur de ressources soit pertinent pour la décision d'autorisation prise par le locataire, ce qui nécessite que le nom de l'étendue soit analysé de manière cohérente.

Exemple de ressource

Le AWS CloudFormation modèle suivant crée un groupe d'utilisateurs pour une mutualisation personnalisée avec un serveur de ressources et un client d'application.

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"