request.auth 在使用模拟器时在 Firestore 规则中为空
request.auth is null in Firestore rules when use Emulator
我正在通过 AngularFire
和 Firebase Emulators
测试 Firestore 规则。
我的firestore rule
很简单,只检查用户是否登录。
什么问题是它不允许任何用户到达 Firestore
,尽管用户在授权之后。
但当我不使用 Emulator(即使用真正的 Firestore )时,它是允许的。
所以我想知道在使用Emulator时是否有额外的设置?
请帮助我!
浏览器控制台:
core.js:6210 ERROR Error: Uncaught (in promise): FirebaseError: [code=permission-denied]: PERMISSION_DENIED:
false for 'create' @ L5
我的环境:
- firebase-工具:9.8.0
- Angular: 11.2.12
- @angular/fire: 6.1.4
我的 Firestore 规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
app.module.ts:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AngularFireModule.initializeApp(environment.firebaseConfig),
AngularFireAuthModule,
AngularFirestoreModule,
],
providers: [
{ provide: USE_AUTH_EMULATOR, useValue: environment.useEmulators ? ['localhost', 9099] : undefined },
{ provide: USE_DATABASE_EMULATOR, useValue: environment.useEmulators ? ['localhost', 9000] : undefined },
{ provide: USE_FIRESTORE_EMULATOR, useValue: environment.useEmulators ? ['localhost', 8080] : undefined },
],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.html:
<button (click)="onLoginButtonClick()">change status(current: {{status}})</button><br>
app.component.ts:
export class AppComponent {
status = 'not logged in';
constructor(
private afAuth: AngularFireAuth,
private afStore: AngularFirestore
) {
this.afAuth.authState
.subscribe((user) => {
if ( user != null ) {
// If user logged in, then add new data.
this.afStore
.collection('test_data')
.doc(user.uid)
.set({data: 'test data'}); // this causes error!
}
});
}
async onLoginButtonClick(): Promise<void>{
if ( this.status === 'not logged in'){
const provider = new firebase.auth.GoogleAuthProvider();
await this.afAuth.signInWithPopup(provider);
this.status = 'logged in';
}
else{
await this.afAuth.signOut();
this.status = 'not logged in';
}
}
}
毕竟,我尝试升级firebase-tools
,它的版本从9.8变成了9.10,然后我的问题就解决了。
我发现了这个 issue,它似乎是 Firebase Emulator 的问题。
谢谢
我正在通过 AngularFire
和 Firebase Emulators
测试 Firestore 规则。
我的firestore rule
很简单,只检查用户是否登录。
什么问题是它不允许任何用户到达 Firestore
,尽管用户在授权之后。
但当我不使用 Emulator(即使用真正的 Firestore )时,它是允许的。
所以我想知道在使用Emulator时是否有额外的设置? 请帮助我!
浏览器控制台:
core.js:6210 ERROR Error: Uncaught (in promise): FirebaseError: [code=permission-denied]: PERMISSION_DENIED:
false for 'create' @ L5
我的环境:
- firebase-工具:9.8.0
- Angular: 11.2.12
- @angular/fire: 6.1.4
我的 Firestore 规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
app.module.ts:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AngularFireModule.initializeApp(environment.firebaseConfig),
AngularFireAuthModule,
AngularFirestoreModule,
],
providers: [
{ provide: USE_AUTH_EMULATOR, useValue: environment.useEmulators ? ['localhost', 9099] : undefined },
{ provide: USE_DATABASE_EMULATOR, useValue: environment.useEmulators ? ['localhost', 9000] : undefined },
{ provide: USE_FIRESTORE_EMULATOR, useValue: environment.useEmulators ? ['localhost', 8080] : undefined },
],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.html:
<button (click)="onLoginButtonClick()">change status(current: {{status}})</button><br>
app.component.ts:
export class AppComponent {
status = 'not logged in';
constructor(
private afAuth: AngularFireAuth,
private afStore: AngularFirestore
) {
this.afAuth.authState
.subscribe((user) => {
if ( user != null ) {
// If user logged in, then add new data.
this.afStore
.collection('test_data')
.doc(user.uid)
.set({data: 'test data'}); // this causes error!
}
});
}
async onLoginButtonClick(): Promise<void>{
if ( this.status === 'not logged in'){
const provider = new firebase.auth.GoogleAuthProvider();
await this.afAuth.signInWithPopup(provider);
this.status = 'logged in';
}
else{
await this.afAuth.signOut();
this.status = 'not logged in';
}
}
}
毕竟,我尝试升级firebase-tools
,它的版本从9.8变成了9.10,然后我的问题就解决了。
我发现了这个 issue,它似乎是 Firebase Emulator 的问题。
谢谢