如何从Angularfire2 facebook身份验证中返回true或false

时间:2017-02-01 02:51:42

标签: angular authentication angularfire2

好的,我对AngularFire2Angular2一般都很陌生,我正在学习AngularFire2提供的身份验证方法。

到目前为止,我已使用Facebook成功实施了登录,我的代码目前位于service

所以代码很简单(可能看起来很恶心),我通过Facebook登录检索用户访问令牌,他们的facebookId,拨打Facebook图表并检索名字,姓氏,性别,电子邮件等然后将这些数据保存在Firebase中这是我执行上述操作的代码:

loginWithFacebook(): FirebaseListObservable<string> {

  return FirebaseListObservable.create(obs => {
      this.af.auth.login({
          provider: AuthProviders.Facebook,
          method: AuthMethods.Popup,
          scope: ['public_profile']
      }).then((authState: any) => {

      let userRef = this.af.database.object('/users/' + authState.uid); // get user profile

       userRef.subscribe(user => {

       let url = `https://graph.facebook.com/v2.8/${user.facebookId}?fields=first_name,last_name,gender,email&access_token=${user.accessToken}`;

       this.http.get(url).subscribe(response => {

          let result = response.json()
             userRef.update({
               first_name: result.first_name,
               last_name: result.last_name,
               gender: result.gender,
               email_address: result.email,
               facebookId: user.facebookId
              })
            })
         })

          obs.next(userRef);

        }).catch(err => {
            obs.throw(err)
        });
    });

我从我的login.component拨打电话,如下所示:

 loginFacebook() {
       this.loginSubscription = this.service.loginWithFacebook().subscribe(data => {
          console.log('after finish', data);  
        });
    }

问题我想要捕获如果登录facebook失败或通过我尝试在Service方法中填充Observable,但是当我在console.log&#39;完成后#&#39; 39;,数据我看到以下内容:

enter image description here

有人可以说明我如何从这种方法中返回真/假吗?如果有人能够看到更清洁的方式,我将非常感激。

1 个答案:

答案 0 :(得分:0)

现在无法测试,你可以这样做:

loginWithFacebook(): Observable<boolean> {

   return this.af.auth.login({
          provider: AuthProviders.Facebook,
          method: AuthMethods.Popup,
          scope: ['public_profile']
      })
      .map((authState: any) => {
         if (!authState) return false;

         let userRef = this.af.database.object('/users/' + authState.uid); // get user profile

         userRef.subscribe(user => {

            let url = `https://graph.facebook.com/v2.8/${user.facebookId}?fields=first_name,last_name,gender,email&access_token=${user.accessToken}`;

            this.http.get(url).subscribe(response => {

               let result = response.json();
               userRef.update({
                  first_name: result.first_name,
                  last_name: result.last_name,
                  gender: result.gender,
                  email_address: result.email,
                  facebookId: user.facebookId
               })
            })
         })

         return true;    
      }).catch(err => {
         return Observable.of(false);
      });
}

loginFacebook() {
   this.loginSubscription = this.service.loginWithFacebook().subscribe(data => {
      console.log('after finish', data);  
   });
}