如何在Google Identity Platform中构建用户与租户的多对多关系?
Google Identity Platform实现单用户多租户归属的最优方案
问题背景
在采用多租户架构的B2B应用中,单个用户可归属多个租户(类似Slack允许同一邮箱+密码用户查看所有所属工作区并无缝切换),但Google Identity Platform(GIP)原生多租户模式下,用户仅能归属零个或一个租户。若要让一个用户归属多个租户,需创建多个拥有唯一uid的账号,这对邮箱+密码登录的用户体验极差——他们需要维护多个密码。
现有设想方案是关闭GIP多租户功能,将用户-租户关联存储在Firestore或自定义声明中,但这种方式难以针对不同租户强制执行不同认证要求(比如用户切换到要求2FA的租户时,无法借助GIP原生能力管理认证环节),因此需要更优方案。
可行方案推荐
方案1:自定义声明+租户级认证校验(推荐)
- 关闭GIP原生多租户模式,用单租户实例管理所有用户,通过自定义声明存储用户关联的所有租户ID列表(例如
{"tenants": ["tenant_001", "tenant_002"]}),同时为每个需特殊认证的租户添加标记(如{"tenant_002_requires_2fa": true})。 - 用户登录后,前端展示可切换的租户列表;切换租户时,后端先校验当前租户的认证要求:
- 若租户要求2FA,调用GIP的
reauthenticateWithCredential接口强制用户完成2FA验证,通过后再切换上下文加载租户专属数据。 - 无需2FA的租户直接切换上下文即可。
- 若租户要求2FA,调用GIP的
- Firestore安全规则可直接读取自定义声明中的租户ID,校验用户权限,避免额外读取数据库:
match /tenants/{tenantId}/{documents=**} { allow read, write: if request.auth != null && tenantId in request.auth.token.tenants; }
方案2:联合身份提供商统一用户身份
- 若业务允许,引导邮箱+密码用户切换至Google、Azure AD等联合IdP登录。GIP可通过IdP的唯一标识符(如邮箱、
sub字段)关联多个租户的用户账号。 - 后台维护用户身份映射表,将同一IdP用户关联的多个GIP租户账号绑定。用户登录时自动获取所有关联租户的权限,切换租户时无需重复授权,仅需切换应用上下文即可。
方案3:共享用户池+多租户实例(折中方案)
- 保留GIP多租户模式,创建一个共享用户池租户,所有用户先在此租户注册(使用邮箱+密码),再通过GIP的
createAuthUri接口将用户关联到其他业务租户。 - 用户登录时先进入共享租户,后台自动获取该用户关联的所有业务租户并展示切换列表;切换至业务租户时,利用GIP的会话转移机制完成上下文切换,无需重复输入密码。
- 每个业务租户可独立配置认证规则(如2FA),切换时自动触发对应租户的认证校验。
方案对比
| 方案 | 核心优势 | 主要劣势 |
|---|---|---|
| 自定义声明+租户级校验 | 实现成本低,用户体验流畅,安全规则高效 | 需自行开发2FA触发与校验逻辑 |
| 联合IdP统一身份 | 原生支持多租户身份关联,认证规则可独立配置 | 依赖第三方IdP,需引导用户切换登录方式 |
| 共享用户池+多租户 | 保留GIP原生多租户特性,认证规则由GIP统一管理 | 架构复杂度高,需维护跨租户会话转移逻辑 |
内容的提问来源于stack exchange,提问作者AmitA
相关产品推荐
相关产品推荐

