Firestore 规则 request.auth 始终为空
Firestore rules request.auth always null
我的 firestore.rules 总是拒绝我的权限缺失或不足的请求,或者它是这么说的。在使用 .valueChanges() 注册到我的 collection 之前,我使用电子邮件和密码登录,但它似乎不起作用。我过去曾多次使用此配置,没有出现任何问题。你能看出我在这里遗漏了什么吗?
我的 firestore.rules 看起来像这样:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
这是一个重现问题的简单组件:
import { Component } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
showItems = false;
items$: Observable<any[]>;
constructor(
private firestore: AngularFirestore,
private auth: AngularFireAuth
) {
this.items$ = firestore
.collection('items')
.valueChanges()
.pipe(
catchError((err) => {
console.error(err);
return of([]);
})
);
}
onAddItem() {
return this.firestore
.collection('items')
.add({
name: 'item',
})
.catch((err) => {
console.error(err);
});
}
onSignIn() {
return this.auth
.signInWithEmailAndPassword('timy@test.com', 'timothee')
.then(() => {
console.log('logged in!');
})
.catch((err) => {
console.error(err);
});
}
onShowItems() {
this.showItems = !this.showItems;
}
}
对应模板:
<div>
<button (click)="onSignIn()">Login</button>
<button (click)="onShowItems()">Show Items</button>
</div>
<div *ngIf="showItems">
<ng-container *ngIf="items$ | async as items; else loading">
<div *ngFor="let item of items">
{{ item.name }}
</div>
</ng-container>
<ng-template #loading> Loading... </ng-template>
<div>
<button (click)="onAddItem()">Add Item</button>
</div>
</div>
</div>
我的 package.json 看起来像这样:
"@angular/animations": "~12.0.3",
"@angular/common": "~12.0.3",
"@angular/compiler": "~12.0.3",
"@angular/core": "~12.0.3",
"@angular/fire": "^6.1.5",
"firebase": "^7.0 || ^8.0"
将 firestore.rules 更改为 allow read, write: if true;
后,我成功访问了我的数据库。
非常感谢您观看...非常感谢!
您在用户登录之前将侦听器附加到数据库。为防止这种情况发生 use an auth state listener:
constructor(
private firestore: AngularFirestore,
private auth: AngularFireAuth
) {
auth.authState.subscribe((user) => {
if (user) {
// User is signed in.
this.items$ = firestore
.collection('items')
.valueChanges()
.pipe(
catchError((err) => {
console.error(err);
return of([]);
})
);
}
});
}
将 Firebase 降级回版本 8.6.1 解决了这个问题。
观看 https://github.com/firebase/firebase-js-sdk/issues/4932 以跟踪 Firebase JS SDK 上的问题。
将 Firebase 降级到版本 8.6.1
npm install firebase@8.6.1
我的 firestore.rules 总是拒绝我的权限缺失或不足的请求,或者它是这么说的。在使用 .valueChanges() 注册到我的 collection 之前,我使用电子邮件和密码登录,但它似乎不起作用。我过去曾多次使用此配置,没有出现任何问题。你能看出我在这里遗漏了什么吗?
我的 firestore.rules 看起来像这样:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
这是一个重现问题的简单组件:
import { Component } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
showItems = false;
items$: Observable<any[]>;
constructor(
private firestore: AngularFirestore,
private auth: AngularFireAuth
) {
this.items$ = firestore
.collection('items')
.valueChanges()
.pipe(
catchError((err) => {
console.error(err);
return of([]);
})
);
}
onAddItem() {
return this.firestore
.collection('items')
.add({
name: 'item',
})
.catch((err) => {
console.error(err);
});
}
onSignIn() {
return this.auth
.signInWithEmailAndPassword('timy@test.com', 'timothee')
.then(() => {
console.log('logged in!');
})
.catch((err) => {
console.error(err);
});
}
onShowItems() {
this.showItems = !this.showItems;
}
}
对应模板:
<div>
<button (click)="onSignIn()">Login</button>
<button (click)="onShowItems()">Show Items</button>
</div>
<div *ngIf="showItems">
<ng-container *ngIf="items$ | async as items; else loading">
<div *ngFor="let item of items">
{{ item.name }}
</div>
</ng-container>
<ng-template #loading> Loading... </ng-template>
<div>
<button (click)="onAddItem()">Add Item</button>
</div>
</div>
</div>
我的 package.json 看起来像这样:
"@angular/animations": "~12.0.3",
"@angular/common": "~12.0.3",
"@angular/compiler": "~12.0.3",
"@angular/core": "~12.0.3",
"@angular/fire": "^6.1.5",
"firebase": "^7.0 || ^8.0"
将 firestore.rules 更改为 allow read, write: if true;
后,我成功访问了我的数据库。
非常感谢您观看...非常感谢!
您在用户登录之前将侦听器附加到数据库。为防止这种情况发生 use an auth state listener:
constructor(
private firestore: AngularFirestore,
private auth: AngularFireAuth
) {
auth.authState.subscribe((user) => {
if (user) {
// User is signed in.
this.items$ = firestore
.collection('items')
.valueChanges()
.pipe(
catchError((err) => {
console.error(err);
return of([]);
})
);
}
});
}
将 Firebase 降级回版本 8.6.1 解决了这个问题。
观看 https://github.com/firebase/firebase-js-sdk/issues/4932 以跟踪 Firebase JS SDK 上的问题。
将 Firebase 降级到版本 8.6.1
npm install firebase@8.6.1