Firebase(angular)facebook authWithRedirect无法正常工作

时间:2015-07-23 16:44:48

标签: angularjs firebase ionic facebook-authentication

我使用angularfire(Ionic应用程序)登录facebook按钮,并使用$ authWithOAuthRedirect重定向到facebook身份验证页面,然后返回应用程序。

如果我在调用facebook重定向身份验证的函数内部有一个$ onAuth方法,它会起作用,但如果它在该函数之外它不起作用。我还有一个用于通过电子邮件和密码进行身份验证的表单,如果$ onAuth在facebook身份验证方法中,那么电子邮件和密码登录将无法正常工作。

这是使用正在初始化firebaseAuth的Auth服务的控制器:

/****
 * Login Page Controller
 * Uses angularfires OAuth for facebook login
****/ 

angular.module('starter')
//inject the Auth service from loginService.js
.controller('LoginController', ['$scope', '$state', 'Auth', function($scope, $state, Auth) {

  //userlogin scope variables: error, authData
  $scope.userLogin = {
    error: null
  };


  //Login for email password
  $scope.loginUser = function() {
    Auth.$authWithPassword({
      email: $scope.userLogin.email,
      password: $scope.userLogin.password
    })
    .then(
      function(authData){
        $scope.userLogin.authData = authData;
      }, 
      function(error) {

        if(error.code == 'INVALID_EMAIL') {
          $scope.userLogin.error = "Invalid Email";
        }  
        else if(error.code == 'INVALID_PASSWORD'){
          $scope.userLogin.error = "Email or Password is incorrect";
        } else {
          $scope.userLogin.error = "Enter a valid email and password";
        }

      }
    )
  };

  //login function for facebook login 
  $scope.loginUserFacebook = function() {
    Auth.$authWithOAuthRedirect('facebook')
    .then(function(authData) {
      console.log('hi');
    })
    //if error due to no redirects 
    .catch(function(error) {

      //authenticate with popup for emulators
      if (error.code === 'TRANSPORT_UNAVAILABLE') {
        Auth.$authWithOAuthPopup('facebook').then(function(authData) {
          // console.log(authData);
        });
      } else {
        console.log(error);
      }

    });
  };
    //After successful auth
    Auth.$onAuth(function(authData) {
      if (authData === null) {
        console.log('Not logged in');
      } 
      else {
         $state.go('driver');
         console.log('Logged in as ' + authData.uid);
      }

      //set authData on controller scope
      $scope.userLogin.authData = authData;
    });

}]);

因此,如果我将Auth。$ onAuth移动到loginUserFacebook函数中,那么它可以正常工作,但会使用电子邮件和密码搞砸loginUser。

我猜猜Facebook重定向并没有像我想的那样解决一个承诺,但是我已经广泛地浏览了Firebase文档并且无法解决这个问题。

1 个答案:

答案 0 :(得分:2)

免责声明:我在Firebase工作

Auth.$authWithOAuthRedirect(...)返回的承诺有点误导,因为这个承诺永远不会被解决 - 它只会失败。如果您尝试在不支持浏览器重定向的平台上使用浏览器重定向(例如,PhoneGap),我们将抛出TRANSPORT_UNAVAILABLE错误,并且承诺将被拒绝。在所有其他"成功"例如,浏览器将重定向到OAuth提供程序,然后返回到您的应用程序,但是承诺的先前状态不再可用。

要在浏览器重定向成功后获取身份验证会话,只需使用Auth.$onAuth(function(authData){...})来监控身份验证状态。在OAuth提供程序的第一次返回时,引擎盖下的Firebase客户端将完成会话的创建,并将事件引发到使用用户当前身份验证状态传递给onAuth(function(authData){...})的回调。

详细了解Firebase身份验证方法here和AngularFire的身份验证工具here