OAuth2阻止对外部服务的访问(“由于访问控制检查,XMLHttpRequest无法加载Firestore”)

时间:2018-08-14 13:49:53

标签: firebase oauth-2.0 xmlhttprequest google-cloud-firestore access-control

我遇到了与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."

在控制台上查看以下屏幕截图:

enter image description here

我该如何解决?


更新:

我从以下位置更改了Firestore规则:

enter image description here

enter image description here

但是,我仍然收到相同的错误消息。 这意味着,以某种方式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");
}

...从控制台查看此屏幕截图: enter image description here

0 个答案:

没有答案