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

时间:2016-05-22 21:31:20

标签: firebase firebase-security firebase-authentication

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自定义身份验证方法肯定会接受它。当我将自定义身份验证服务器返回的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 个答案:

答案 0 :(得分:2)

根据您指向的文档,您可以在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"
  }
}