angular + firestore:如何允许 public 读取文档
angular + firestore: how to allow public read access to a document
我是一名学生开发者,在我的 angular 应用中试用新的 Firestore,但遇到了安全规则问题。
我想要达到的目标:
使用模板绑定在 angular 视图中显示 firestore 文档。未经身份验证的用户应该可以查看该文档。
问题:
如果未经身份验证的用户试图查看页面,则会发生权限错误:
ERROR Error: Missing or insufficient permissions.
at new FirestoreError (error.js:164)
模板文件:
<p>{{ (item | async)?.name }}</p>
component.ts 文件:
interface Profile {
name: string;
}
...
private itemDoc: AngularFirestoreDocument<Profile>;
item: Observable<Profile>;
...
ngOnInit() {
this.itemDoc = this.afs.doc<Profile>('profiles/0mlC8uWaKeArzk0sfIfX');
this.item = this.itemDoc.valueChanges();
}
firestore 规则:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read;
allow write: if request.auth != null;
}
}
}
如您所知,对您的 Cloud Firestore 数据的访问由 Security Rules 控制。当您收到 "insufficient permissions error" 时,这意味着您的读取或写入已被规则拒绝。
在你的情况下,你有这些规则:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
大致翻译成英文,这些是 "allow reading or writing to any document in the database as long as the user is signed in"。
因此,如果您遇到错误,则表示用户未登录 (request.auth == null
)。
所以你有两个选择:
选项 1:将 Auth 添加到您的应用程序
您可以将 Firebase Authentication 添加到您的应用程序。满足您的规则的最简单的事情是匿名身份验证:
firebase.auth().signInAnonymously()
.then(function() {
// You're signed in, reads will work
})
.catch(function(error) {
// Handle Errors here.
// ...
});
选项 2:更改您的安全规则
如果您希望所有用户都能读取您应用中的所有数据,您可以打开规则如下:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if true;
allow write: if request.auth != null;
}
}
}
我是一名学生开发者,在我的 angular 应用中试用新的 Firestore,但遇到了安全规则问题。
我想要达到的目标:
使用模板绑定在 angular 视图中显示 firestore 文档。未经身份验证的用户应该可以查看该文档。
问题:
如果未经身份验证的用户试图查看页面,则会发生权限错误:
ERROR Error: Missing or insufficient permissions. at new FirestoreError (error.js:164)
模板文件:
<p>{{ (item | async)?.name }}</p>
component.ts 文件:
interface Profile {
name: string;
}
...
private itemDoc: AngularFirestoreDocument<Profile>;
item: Observable<Profile>;
...
ngOnInit() {
this.itemDoc = this.afs.doc<Profile>('profiles/0mlC8uWaKeArzk0sfIfX');
this.item = this.itemDoc.valueChanges();
}
firestore 规则:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read;
allow write: if request.auth != null;
}
}
}
如您所知,对您的 Cloud Firestore 数据的访问由 Security Rules 控制。当您收到 "insufficient permissions error" 时,这意味着您的读取或写入已被规则拒绝。
在你的情况下,你有这些规则:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
大致翻译成英文,这些是 "allow reading or writing to any document in the database as long as the user is signed in"。
因此,如果您遇到错误,则表示用户未登录 (request.auth == null
)。
所以你有两个选择:
选项 1:将 Auth 添加到您的应用程序
您可以将 Firebase Authentication 添加到您的应用程序。满足您的规则的最简单的事情是匿名身份验证:
firebase.auth().signInAnonymously()
.then(function() {
// You're signed in, reads will work
})
.catch(function(error) {
// Handle Errors here.
// ...
});
选项 2:更改您的安全规则
如果您希望所有用户都能读取您应用中的所有数据,您可以打开规则如下:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if true;
allow write: if request.auth != null;
}
}
}