【发布时间】:2021-08-23 17:35:26
【问题描述】:
我正在尝试对我的应用中的用户进行身份验证。我有一个登录屏幕,它需要一个电子邮件和密码,然后运行这个:
login2(email: string, password: string): Observable<any> {
const signInObs: Observable<UserCredential> = from(this.fAuth.signInWithEmailAndPassword(email, password));
return signInObs.pipe(take(1), catchError(this.handleError), mergeMap((result: UserCredential) => {
console.log(`done this ONE... ${result.user.uid}`);
return this.firestore.collection('users').doc(result.user.uid).get().pipe(catchError(this.handleError), mergeMap((doc: DocumentSnapshot<any>) => {
console.log(`done this two... ${doc.data().name}`);
return result.user.getIdTokenResult(true).then((token: IdTokenResult) => {
// authenticate the user in the code
console.log(`done this three.. ${token.claims.admin}`);
this.handleAuthentication(
result.user.email,
result.user.uid,
doc.data().name,
token.claims.admin,
token.token
);
}).catch(error => {
throw new Error(error);
});
}));
}));
}
但是旧的ERROR FirebaseError: Missing or insufficient permissions. 错误发生在this.firebase.collection('users').doc(result.user.uid).get() 部分。没有那个部分,这一切都很好 - 即它登录,给我一个令牌等等。一切正常,只是它不允许我访问该用户记录...
我的数据库中的规则是:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// match logged in user doc in users collection
match /users/{userId} {
allow create: if request.auth.uid != null;
allow read: if request.auth != null && request.auth.uid == userId;
}
// match docs in the users collection
match /users/{userId} {
allow read, write: if request.auth.uid != null;
}
}
}
在提到可能是 FireAuth 和 Firestore 模块无法正确通信的回复时,app.module 的外观是这样的。这些都是 app.module 中对 angular fire 模块的引用。
import { environment } from 'src/environments/environment';
import { AngularFireModule } from '@angular/fire';
import { AngularFireFunctions } from '@angular/fire/functions';
import { AngularFireAuthModule } from '@angular/fire/auth';
import { AngularFirestoreModule } from '@angular/fire/firestore';
@NgModule({
declarations: [
// just components
],
imports: [
// other imports
AngularFireModule.initializeApp(environment.firebaseConfig),
AngularFirestoreModule,
AngularFireAuthModule
],
providers: [
{provide: HTTP_INTERCEPTORS, useClass: AuthInterceptorService, multi: true},
AuthenticationService,
AngularFireFunctions
],
bootstrap: [AppComponent]
})
export class AppModule { }
以及Authentication服务中的构造函数:
constructor(private fAuth: AngularFireAuth,
private firestore: AngularFirestore,
private router: Router) {
}
我已经尝试通过模拟器运行 id,它似乎应该可以工作。我已经从登录中记录了用户 ID,它与它应该寻找的文档名称相同。
这一切似乎都应该起作用,但事实并非如此。我已经阅读了一堆教程,但没有一个做任何巨大的不同 - 教程之间的差异是不一致的。
我认识到代码在编写方式上并不完美,但我想先让它发挥作用。
我在数据库中的数据结构是这样的:
文档的ID是相关人员的用户ID,我仔细检查了它们都是正确的。
如果我允许通用读写,请仔细检查它,否则一切正常......只有当这些规则出现时它们才不起作用。
【问题讨论】:
-
请添加初始化
fAuth和firebase的方式。在这种情况下,firebase似乎也不是firebaseSDK 而是 Firestore 实例 - 您应该将其重命名为firestore、db等其他名称。按照惯例,您应该考虑变量保留"firebase"的名称 - 像undefined一样对待它,不要将其重新分配给其他任何东西。 -
就在构造函数中:constructor(private fAuth: AngularFireAuth, private firebase: AngularFirestore, private router: Router) {}... db 是我的应用程序中的服务名称,但可能在其中私下它可能改名就好,谢谢。
-
虽然这只是告诉我它们是如何传递到您的组件中的,但它并没有涵盖您在何处以及如何初始化它们。我正在寻找您在哪里使用
initializeApp()等等。 -
哦,这在我的应用模块文件中:
imports: [ AngularFireModule.initializeApp(environment.firebaseConfig) ]。配置参数取自项目,但现在要仔细检查它们......(编辑:一切看起来都很好,firebaseConfig 位于正确的位置,并且与 firebase 控制台上的细节相同)。
标签: typescript firebase google-cloud-firestore firebase-security angularfire