自定义范围多租户最佳实践 - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自定义范围多租户最佳实践

Amazon Cognito 支持资源服务器的自定义 OAuth 2.0 范围。您可以在用户池中实现具有自定义范围的 machine-to-machine (M2M) 授权模型的应用程序客户端多租户。基于范围的多租户通过在应用程序客户端或应用程序配置中定义访问权限来减少实施 M2M 多租户所需的工作量。

注意

目前,您无法自定义访问令牌以在客户凭证 (M2M) 授权流程中添加自定义声明或范围。

下图说明了自定义范围多租户的一个选项。它显示每个租户都有一个专用的应用程序客户端,该客户端可以访问用户池中的相关范围。

此图说明了多租户架构中自定义作用域的流程。
何时实施自定义范围的多租户

当您的使用是在机密客户端中使用客户凭据进行 M2M 授权时。作为最佳实践,请创建应用程序客户端专用的资源服务器。自定义作用域多租户可以依赖于请求,也可以依赖于客户端。

视请求而定

实现应用程序逻辑,仅请求符合租户要求的范围。例如,应用程序客户端可能能够向 API A 和 API B 授予读写权限,但租户应用程序 A 仅请求 A 的读取API范围和表示租赁的范围。此模型允许租户之间更复杂地组合共享作用域。

视客户而定

在您的授权请求中请求分配给应用程序客户端的所有范围。为此,请省略scope请求中的请求参数。令牌端点此模型允许应用程序客户端存储您要添加到自定义范围的访问指示器。

无论哪种情况,您的应用程序都会收到访问令牌,其作用域表明它们对所依赖的数据源的权限。作用域还可以向您的应用程序提供其他信息:

  • 指定租约

  • 为请求记录做出贡献

  • 指明APIs该应用程序已被授权查询

  • 告知活跃客户的初步支票。

工作量水平

根据应用程序的规模,自定义范围的多租户需要不同的工作量。您必须设计允许您的应用程序解析访问令牌并发出相应API请求的应用程序逻辑。

例如,资源服务器作用域的格式为[resource server identifier]/[name]。资源服务器标识符不太可能与租户作用域的授权决策相关,因此需要一致地解析作用域名称。

资源示例

以下 AWS CloudFormation 模板使用一个资源服务器和应用程序客户端为自定义范围的多租户创建用户池。

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"