Angular 当 writing/reading 来自受 Firebase 规则保护的数据时使用令牌

Angular use of tokens when writing/reading from firebase rules-protected data

问题: 使用身份验证令牌从 Firebase 数据 read/write 的模型是什么?

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

框架离子w/angular

设置 我建立了一个 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 实时数据库 read/write 时,我认为我应该将其中一个令牌作为 html.get() 中 JSON 有效负载的一部分传回或 html.patch() 语句。

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。我错过了一个概念吗?

感谢您的帮助。

保罗

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

然后,如 here 所述,将其添加到 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.

更容易