我遇到了与Firebase和受OAuth2保护的REST服务器之间的相互作用有关的问题。
如果在未启用身份验证的情况下启动REST服务器,则一切正常。
但是,如果REST服务器在启用身份验证的情况下启动,则Angular前端和firebase之间的通信会受到干扰。
应用程序的体系结构如下: 前端包含一个Angular应用程序。后端由两部分组成:firebase和REST服务器(借此REST服务器再次连接到Hyperledger-fabric-blockchain ...,但这与这个问题无关)。
如果未为REST服务器启用身份验证,则Angular前端与REST服务器之间的通信以及Angular前端与firebase之间的通信(用于存储用户和图片的某些主数据)运行良好。
但是,在为REST服务器启用身份验证后,Angular前端将无法再调用firebase。
以下错误消息出现在控制台中:
"XMLHttpRequest cannot load [https://firestore......] due to access control checks."
在控制台上查看以下屏幕截图:
我该如何解决?
更新:
我从以下位置更改了Firestore规则:
到
但是,我仍然收到相同的错误消息。 这意味着,以某种方式OAuth2(位于前端和REST服务器之间)可防止有角度的前端访问firestore(与REST服务器或OAuth2无关)。
详细说明(可能不需要阅读):
让我通过AuthService中发生的事情更详细地说明问题。
这是auth.service.ts文件的开头:
export class AuthService implements OnDestroy {
private idOfCurrentUser: string;
private roleOfCurrentUser: string;
private user: Observable<User>;
private subscription1: Subscription;
private subscription2: Subscription;
constructor(private router: Router, private db: AngularFirestore, private angularFireAuth: AngularFireAuth, private httpClient: HttpClient, private activatedRoute: ActivatedRoute) {
this.user = this.angularFireAuth.authState.pipe(
switchMap(user => {
if (user) {
return this.db.doc<User>(`users/${user.uid}`).valueChanges();
}
else {
return of(null);
}
})
);
this.subscription1 = this.user.subscribe(participant => {
console.log("With authentication enabled, THIS DOES NEVER GET PRINTED");
if (participant) {
this.idOfCurrentUser = participant.id;
this.roleOfCurrentUser = participant.role;
}
else {
this.idOfCurrentUser = "admin";
this.roleOfCurrentUser = "NetworkAdmin";
}
});
//subscription2 only plays a role, if authentication for the REST server is enabled.
this.subscription2 = this.activatedRoute
.queryParams
.subscribe(queryParams => {
let authenticated = queryParams['authenticated'];
if (authenticated) {
this.router.navigate(['']);
return this.getContentOfWalletOfCurrentUser()
.then(result => {
if (result.length > 0) {
console.log("The user already has a business network card.");
}
else {
while(this.idOfCurrentUser == null || this.roleOfCurrentUser == null) {
console.log("IN LOOP");
}
this.createBusinessNetworkCard();
}
});
}
});
}
如果未启用REST服务器的身份验证,则subscription1可以正常运行,并从Firestore接收当前用户的数据(例如,当前用户的“角色”)。
但是,在启用身份验证(GitHub OAuth2)的情况下启动REST服务器时,subscription1不起作用。 Angular App和Firebase之间的通信被阻止。
因此,代码被困在以下循环中:
while(this.idOfCurrentUser == null || this.roleOfCurrentUser == null) {
console.log("IN LOOP");
}