将IDP与Database分离:基于Firebase的用户数据交互方案咨询
问题描述
我正尝试搭建一套配置:由身份提供商(IDP)完成用户认证后,若用户未在数据库中则即时将其配置到库内,若已存在则返回关联数据。我使用Firebase作为数据库,目前应用前端已实现IDP认证功能,但不想使用Firebase Authentication,希望在用户登录后安全地从Firebase获取用户数据,请问有什么合适的实现方案?
更新:我最终选择了另一种方案,使用Firebase Auth结合Google认证,并通过hosted domain(hd)参数限制仅允许特定组织的Google账户进行认证。我知道这并非通用方案,但符合我的需求。
可行实现方案
如果不想依赖Firebase Auth,可通过以下几种方式实现安全的Firebase数据库访问:
方案一:自定义JWT验证 + Firebase安全规则
- 从IDP获取用户JWT令牌,确保令牌包含唯一用户标识(如邮箱、用户ID)
- 借助Cloud Functions编写验证函数:接收前端传来的JWT,调用IDP官方接口验证令牌有效性,返回用户唯一标识
- 配置Firebase数据库安全规则,仅允许验证通过的用户访问自身数据:
// Firestore示例规则 match /users/{userId} { allow read, write: if request.auth.uid == userId; } - 前端拿到IDP的JWT后,调用上述Cloud Functions接口获取Firebase访问凭证,再用凭证执行数据库操作
- 数据处理逻辑:查询
users集合中对应用户标识的文档,不存在则创建新文档写入基础信息,存在则直接返回文档数据
方案二:IDP令牌直接验证 + 安全规则
- 部分主流IDP(如Google、Auth0)的JWT可直接被Firebase安全规则验证
- 配置安全规则,直接校验IDP JWT的签名与核心声明:
// 验证Google ID Token示例 match /users/{userId} { allow read, write: if request.token.email_verified == true && request.token.email == userId; } - 前端将IDP获取的JWT直接作为身份凭证传入数据库操作,规则会自动完成令牌合法性校验
- 同样遵循“查询-不存在则创建-存在则返回”的逻辑处理用户数据
方案三:后端代理数据库访问
- 所有Firebase数据库请求均通过你的后端服务中转
- 前端登录IDP后,将令牌传给后端,后端验证令牌有效性后,使用Firebase Admin SDK访问数据库
- 后端统一处理用户数据的创建、查询逻辑,再将结果返回前端
- 此模式下,Firebase数据库安全规则可设置为仅允许Admin SDK访问,所有权限控制由你的后端实现
方案补充
你最终选用的Firebase Auth + Google认证+hd参数限制方案,在特定场景下非常高效——通过hd参数直接限定企业域账户,结合Firebase Auth的原生集成,省去了自定义验证的开发成本,很适合内部系统或特定组织用户的使用场景。
内容的提问来源于stack exchange,提问作者Steven Bash
相关产品推荐
相关产品推荐

