如何为企业不同子域名服务配置Google Identity Platform专属Token受众
解决Google Identity Platform多服务Token受众区分问题
针对你在不同子域名服务中使用Google Identity Platform做SSO时,Token受众统一为Firebase项目ID的问题,可以通过以下几种方案实现服务间的Token权限隔离:
方案1:为每个服务创建独立的OAuth客户端ID
这是最符合OAuth 2.0最佳实践的方案,每个服务对应唯一的客户端标识,Token的aud字段会自动匹配该客户端ID:
- 登录GCP控制台,进入你的Firebase关联项目
- 导航到「API和服务」→「凭据」页面
- 点击「创建凭据」→「OAuth客户端ID」,选择「Web应用」类型
- 填写对应服务的信息:
- JavaScript起源:填写服务的子域名(如
https://staff-portal.company.com) - 授权重定向URI:填写服务的认证回调地址(如
https://staff-portal.company.com/auth/callback)
- JavaScript起源:填写服务的子域名(如
- 重复上述步骤,为
retail-portal.company.com创建单独的OAuth客户端ID - 在各服务的认证请求中,使用对应的
client_id参数发起登录流程 - 验证Token时,检查
aud字段是否等于当前服务的客户端ID,不匹配则拒绝访问
方案2:使用自定义受众(Audience)参数
如果不想创建多个客户端ID,可以在认证请求中指定自定义受众,让Token的aud字段匹配服务标识:
- 首先在GCP控制台的「Identity Platform」→「设置」→「授权域」中,添加你的服务域名作为允许的受众(如
https://staff-portal.company.com) - 在发起认证请求时,添加
audience参数,值为当前服务的标识(比如OAuth授权URL中追加&audience=https://staff-portal.company.com) - 返回的ID Token中,
aud字段会变为你指定的自定义受众 - 后端验证Token时,检查
aud是否与当前服务的标识完全匹配
方案3:利用自定义声明标记服务权限
如果需要更灵活的权限控制,可以通过Admin SDK为用户添加服务专属的自定义声明:
- 在用户完成认证后,通过云函数或后端服务调用Firebase Admin SDK,根据用户访问的服务添加自定义声明,例如:
admin.auth().setCustomUserClaims(uid, { allowed_service: "staff-portal" }); - 发起认证请求时,可以通过
state参数传递服务标识,后端根据该标识设置对应的声明 - 验证Token时,解析并检查
allowed_service字段是否匹配当前服务的标识,不匹配则拒绝请求
关键注意事项
- 所有Token验证逻辑必须在后端执行,不能依赖前端判断,避免被篡改
- 使用自定义受众时,必须确保该受众已被添加到Identity Platform的允许列表,否则认证请求会失败
- 多客户端ID方案的隔离性最强,推荐用于需要严格权限分离的场景
内容的提问来源于stack exchange,提问作者Mohammad Nikravan
相关产品推荐
相关产品推荐

