【问题标题】:Fetching custom fields from auth object in Firebase从 Firebase 中的 auth 对象获取自定义字段
【发布时间】:2015-11-24 08:21:07
【问题描述】:

当客户在其他设备上签名时,我试图使他们的身份验证令牌无效/撤销。初始 auth-token 是通过我们的服务器而不是 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 对象中的自定义字段都不存在。

【问题讨论】:

  • 我已成功使用此方法。您很可能没有正确创建 JWT。请发布您用来创建它的代码。您使用的是 FirebaseTokenGenerator 库还是其他东西? Docs
  • 感谢 Anid 的回复。不,不使用 FirebaseTokenGenerator,而是使用自定义 JWT 库。在 ref.authWithCustomToken 中传回的 auth 对象是否应该反映 firebase 正在解析的内容?如果仍然遇到问题,我会再次检查并发布代码。谢谢!

标签: firebase firebase-security


【解决方案1】:

您在自定义身份验证对象中输入的任何内容都将在安全规则中可用,并且将成为在客户端进行身份验证后返回的 authData 的一部分。创建 JWT 时,您必须遵循 Firebase 的特定规则,即 outlined here。重要的部分是 d 密钥包含您想要提供的身份验证数据。下面是有效负载的基本示例。

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

http://jwt.io/ 是快速创建 JWT 进行测试的绝佳工具。如果您将上述负载与您的 Firebase 密钥结合使用,您应该会在您的身份验证数据和安全规则中看到相同的负载。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多