我一直在尝试从firestore读取数据,但无法读取…
async authUser() {
let token = this._tokman.getUserToken();
await this._afa.signInWithCustomToken(token);
}
从服务器获取令牌并将其传递给firebase以对用户进行身份验证。然后调用firestore获取数据。。
async data() {
await this._afa.onAuthStateChanged(user => {
if (user) {
this._afs.collection('gps-data').doc(user.uid)
.valueChanges()
.subscribe(res => {
console.log(res);
}, err => {
console.log(err);
})
}
})
}
但是从firestore得到这个错误。
FirebaseError: Missing or insufficient permissions.
at new e (http://localhost:4200/vendor.js:51950:23)
at http://localhost:4200/vendor.js:62177:28
at http://localhost:4200/vendor.js:62178:18
at e.onMessage (http://localhost:4200/vendor.js:62200:10)
at http://localhost:4200/vendor.js:62117:26
at http://localhost:4200/vendor.js:62148:37
at http://localhost:4200/vendor.js:66953:31
at ZoneDelegate.invoke (http://localhost:4200/polyfills.js:460:30)
at Zone.run (http://localhost:4200/polyfills.js:219:47)
at http://localhost:4200/polyfills.js:953:40
消防仓库的安全规则是
service cloud.firestore {
match /databases/{database}/documents {
match /gps-data/{userid} {
allow read: if request.auth.token.sub == userid;
}
}
}
还将jwt令牌添加到http头中。请指引我哪里做错了。
更新解决方法:更改firebase版本来自
"firebase": "^7.0 || ^8.0"
到
"firebase": "^8.0.2"
不更改安全规则
问题是此行中的token.sub
:
request.auth.token.sub == userid;
令牌的sub
是为其铸造该令牌的项目ID。因此,您将项目ID和用户ID进行比较,但两者永远不会相同。
您想在这里比较两个用户ID,即:
request.auth.uid == userid;
我强烈建议您花一些时间阅读有关安全规则的文档,特别是关于保护身份验证和只允许内容所有者访问的部分。