2015-07-23 2 views
0

У меня есть логин с кнопкой facebook с помощью angularfire (Ionic app), и я использую $ authWithOAuthRedirect для перенаправления на страницу аутентификации facebook, а затем обратно в приложение.Firebase (угловой) facebook authWithRedirect не работает исправление

Он работает, если у меня есть метод $ onAuth внутри функции, которая вызывает аутентификацию переадресации facebook, но если она находится вне этой функции, она не работает. У меня также есть форма для аутентификации с помощью электронной почты и пароля, и если $ onAuth находится в методе проверки подлинности facebook, тогда логин электронной почты и пароля будет работать неправильно.

Вот контроллер, который использует службу идентификации, которая инициализирует firebaseAuth:.

/**** 
* 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 и не могу понять это.

+0

Не стесняйтесь пинговать меня при грабете в firebase dot com, если ниже ответ не получит этого уточненного/разрешенного для вас. –

ответ

2

Отказ от ответственности: Я работаю в Firebase

Обещание вернулся из Auth.$authWithOAuthRedirect(...) немного вводит в заблуждение, потому что это обещание никогда не будет решен - он может только потерпеть неудачу. В случаях, когда вы пытаетесь использовать переадресацию браузеров на платформе, которая их не поддерживает (например, PhoneGap), мы будем вызывать ошибку , и обещание будет отклонено. Во всех других «успешных» случаях браузер перенаправляется на провайдер OAuth, а затем обратно в ваше приложение, но предыдущее состояние обещания больше не доступно.

Чтобы получить сеанс аутентификации после успешного перенаправления браузера, просто используйте Auth.$onAuth(function(authData){...}) для контроля состояния аутентификации. При первом возврате от поставщика OAuth клиент Firebase под капотом завершит создание сеанса и поднимет событие на обратный вызов, переданный в onAuth(function(authData){...}) с текущим состоянием авторизации пользователя.

Подробнее об объектах Firebase auth here и аппаратных средствах AngularFire here.