首页 > 解决方案 > 从受 Firebase 规则保护的数据写入/读取时令牌的角度使用

问题描述

问题: 使用身份验证令牌从 Firebase 数据读取/写入的模型是什么?

长格式问题:我已成功登录 Firebase,并且我有一组身份验证令牌数据来响应该登录。我假设当我对 Firebase 文档执行 http.get() 或 http.patch() 时,我需要将该令牌传回。但我还没有弄清楚如何正确地做到这一点。

带角度的框架离子

设置 我已经建立了一个 Firebase 数据集,并设置了如下访问规则:

{


  "rules": {
      "mission-cafe" : {
        ".read": "auth != null", 
        ".write": false
    },
      "issues" : {
        ".read": "auth != null", 
        ".write": "auth != null"
    }
  }
}

当我向 firebase 发出身份验证请求时,我会返回一组用户数据,如下所示:

Object
accessToken: "eyJhbI-long string-ww3w"

expirationTime: 1631656873062

refreshToken: "ACzBnC another long string dUJHK-"


[[Prototype]]: Object

因此,现在当我从 Firebase 实时数据库读取/写入时,我认为我应该将其中一个令牌作为 html.get() 或 html.patch() 语句中的 JSON 有效负载的一部分传回。

const getString='https://freelance-xxxx-default-tdb.firebaseio.com/xxxxxx.json';
return this.http.get<{ [key: string]: MyData }>(getString).pipe(...)

关键问题 1:放置从原始身份验证返回的令牌数据的正确语法是什么?

当我阅读文档时,我显然应该在 http.get() 或 patch() 语句中发回一个 &auth='long-token-string" ......但我无法找到关于哪个令牌的文档return 以及关键字 auth 实际上是否是该字符串的正确标识符。

关键问题 2: 显然发送 uid 是代替身份验证令牌的选项。在我的应用程序中,我想从匿名登录开始,所以在第一次数据访问时我不会有 uid。我错过了一个概念吗?

谢谢您的帮助。

保罗

标签: angularfirebaseauthenticationfirebase-realtime-databasetoken

解决方案


您需要按照文档中描述的方法从客户端检索 Firebase ID 令牌firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).

然后,如此所述,将其添加到 url 的末尾作为查询字符串参数: const getString = 'https://freelance-xxxx-default-tdb.firebaseio.com/xxxxxx.json?auth=' + idToken

由于您不共享那么多代码,因此这里有一个带有 axios 库的通用 JS 示例:

 firebase     // use this.fireAuth.signInAnonymously() in your case
    .auth()
    .signInAnonymously()
    .then((userCredential) => {
      // We get the user from the userCredential,
      // but we could very well do firebase.auth().currentUser as well
      return userCredential.user.getIdToken(/* forceRefresh */ true);
    })
    .then((idToken) => {
      return axios.get(
        'https://freelance-xxxx-default-tdb.firebaseio.com/xxxxxx.json?auth=' + idToken
      );
    })
    .then((response) => {
      // handle success
      console.log(response);
    })
    .catch((error) => {
      // handle error
      console.log(error);
    });

旁注:是否有任何不使用 JS SDK 与 RTDB 交互的具体原因?它比使用 REST API 更容易。


推荐阅读