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.
更容易
问题: 使用身份验证令牌从 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.
更容易