从Firebase中的auth对象中获取自定义字段

时间:2015-11-24 08:21:07

标签: firebase firebase-security

我正在尝试在其他设备上签名时无效/撤消客户端的身份验证令牌。初始身份验证令牌是通过我们的服务器提供的,而不是firebase(但使用相同的密钥,因此也适用于firebase)。

对于每个用户,我们保存一个相关的密码,该密码作为auth-token的一部分传递,当用户切换设备时 - 我们从服务器发出一个新密码并比较密码以使服务器上的令牌无效。但Firebase连接仍然存在。

我正在尝试为每个用户在firebase上存储密码。每次我们在后端更改密码时都可以更新,并使用它来使firebase令牌无效。但是,我无法从auth对象中提取密码。有什么想法吗?

这是我的firebase安全规则。

 {
    "rules": {

      ".read": root.child('passwords').child(auth.uid).val() == auth.password,
      ".write": root.child('passwords').child(auth.uid).val() == auth.password

   }

}

令人惊讶的是,auth对象中没有自定义字段存在。

1 个答案:

答案 0 :(得分:0)

您在自定义身份验证对象中放置的内容将在安全规则中可用,并且是在客户端上进行身份验证后返回的authData的一部分。在您创建JWT时,您必须遵循Firebase的特定规则outlined here。重要的一部分是d密钥包含您想要提供的身份验证数据。这是有效载荷可能是什么样子的基本示例。

{
  "v": "0",
  "iat": 1448391639,
  "d": {
    "uid": "user1234",
    "password": "mySecretPassword" 
  }
}

http://jwt.io/是一个很好的工具,可以快速创建JWT进行测试。如果您将上述有效负载与Firebase密钥结合使用,则应在auth数据安全规则中看到相同的有效负载。

f.authWithCustomToken('eyJhbGciOiJIUz...', function(err, data) {
    if (err) {
        // Handle error
    } else {
        console.log(data.auth); // {uid: "userId1234", password: "mySecretPassword"}
    }
});