可以在 Firebase 3 中实现自定义身份验证属性并将其与安全安全规则一起使用吗?

Posted

技术标签:

【中文标题】可以在 Firebase 3 中实现自定义身份验证属性并将其与安全安全规则一起使用吗?【英文标题】:Can custom auth properties be implemented and used with security security rules in Firebase 3? 【发布时间】:2016-09-19 16:15:30 【问题描述】:

legacy Firebase documentation 表示您可以将属性插入到数据库安全规则中使用的 auth 对象中。事实上,在升级到版本 3 之前,我的应用程序中的这种方法运行得非常好。

“传递给 createToken() 的任何值都将附加到 auth 变量中,以便在您的安全和 Firebase 规则中使用。”

新的 Firebase 身份验证服务仍然允许使用自定义身份验证令牌,new rules documentation 声明:

“创建自己的自定义身份验证令牌的开发人员可以选择向这些令牌添加额外的声明。这些额外的声明将出现在规则中的 auth 变量中。”

...但这在安全规则中不起作用。要调试,在版本 3 中似乎没有办法通过 firebase API 访问 auth 对象。例如。 getAuth() 方法似乎丢失了,并且 auth.getCurrentUser() 方法不返回我添加给用户的任何自定义声明,所以我不清楚它们是否存在于 auth 对象中。文档here 指出:

“您还可以选择指定要包含在自定义令牌中的其他声明。这些声明将在您的安全规则中的 auth / request.auth 对象中可用。”

运行应用程序时,对于路径“/domains/mydomaincom”的任何读/写尝试,对于当前已通过身份验证的用户,我会收到拒绝访问错误。

但是,我肯定会生成一个自定义签名的 JWT 令牌,并且它肯定会被 Firebase 自定义身份验证方法接受。当我将 custom-auth-server-returned JWT 令牌有效负载粘贴到 Firebase 规则模拟器中时,我肯定也获得了访问正确路径的规则(例如“/domains/mydomaincom”下的所有数据)。

当我通过 getCurrentUser() 查看用户时,我无法看到 firebase auth 对象,因为它可能会将自身呈现给规则引擎(例如,我的自定义声明似乎都没有包含在 currentUser 对象中)所以我真的不明白如何进一步调试。

我正在专门寻找有关 Firebase 自定义身份验证规则中可用的其他调试方法的提示,和/或其他人是否可以确认他们已成功获取自定义身份验证属性以使用 Firebase 3 中的规则.

这里是自定义 JWT 的(安全隐藏的)内容,作为从服务器端生成的令牌解码的客户端。


  "iss": "<client_email>",
  "sub": "<client_email>",
  "aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  "exp": 1463955043,
  "iat": 1463951442,
  "provider": "gas",
  "domain": "mydomaincom",
  "email": "myemail@mydomain.com",
  "uid": "<FB UID HERE>",
  "userGoogToken": "<LONG TOKEN HERE>",
  "adminGoogToken": "<LONG TOKEN HERE>"

这里是规则文件:


  "rules": 
    "domains": 
      "$domain": 
        ".read": "$domain == auth.domain",
        ".write": "$domain == auth.domain"
      
    
  

【问题讨论】:

【参考方案1】:

根据您指出的文档,您可以在身份验证规则中使用的附加声明需要在 claims 属性中指定为附加声明的映射。试试这个:


  "iss": "<client_email>",
  "sub": "<client_email>",
  "aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  "exp": 1463955043,
  "iat": 1463951442,
  "provider": "gas",
  "email": "myemail@mydomain.com",
  "uid": "<FB UID HERE>",
  "userGoogToken": "<LONG TOKEN HERE>",
  "adminGoogToken": "<LONG TOKEN HERE>",
  "claims": 
    "domain": "mydomaincom"
  

【讨论】:

感谢您的回答。不知何故,我错过了在构建自己的 JWT 时定义自定义声明属性作为指导的文档部分。我无法使用提供的 node.js 库,因为我正在 Google Apps 脚本中构建令牌生成器。在“声明”属性中传递自定义身份验证属性确实允许在实时数据库安全规则中评估它们!干杯。

以上是关于可以在 Firebase 3 中实现自定义身份验证属性并将其与安全安全规则一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WCF 服务中实现自定义身份验证

如何在 ASP.NET MVC 5 中实现自定义身份验证

如何在 webflux 中实现自定义身份验证管理器时对未经授权的请求响应自定义 json 正文

如何在 ASP.NET MVC 中实现自定义主体和身份?

在 MVC 中实现自定义身份和 IPrincipal

在 Firebase 中实施自定义身份验证的工作流程是啥?