2015-07-23 2 views
0

J'ai un login avec le bouton facebook en utilisant angularfire (application Ionic) et j'utilise $ authWithOAuthRedirect pour rediriger vers la page d'authentification facebook puis de nouveau à l'application.Firebase (angulaire) facebook authWithRedirect ne fonctionne pas corriger

Cela fonctionne si j'ai une méthode $ onAuth à l'intérieur de la fonction qui appelle l'authentification de redirection facebook, mais si elle est en dehors de cette fonction, elle ne fonctionne pas. J'ai aussi un formulaire pour m'authentifier avec un email et un mot de passe et si $ onAuth est dans la méthode d'authentification de facebook, le login par email et mot de passe ne fonctionnera pas correctement.

est ici le contrôleur qui est l'utilisation du service Auth qui initialise la 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; 
    }); 

}]); 

Donc, si je propose que Auth onAuth $ vers le haut dans la fonction loginUserFacebook il fonctionne, mais bousille le LoginUser avec le courrier électronique et mot de passe.

Je suppose que la redirection facebook ne résout pas une promesse comme je le pensais, mais j'ai parcouru les documents Firebase de manière approfondie et ne peux pas comprendre cela.

+0

N'hésitez pas à cingler à rob à firebase dot com si la réponse ci-dessous ne permet pas de clarifier/résoudre pour vous. –

Répondre

2

Disclaimer: Je travaille à Firebase

La promesse de retour de Auth.$authWithOAuthRedirect(...) est un peu trompeur, parce que cette promesse ne sera jamais résolu - il ne peut pas échouer. Dans les cas où vous essayez d'utiliser des redirections de navigateur sur une plate-forme qui ne les prend pas en charge (PhoneGap, par exemple), nous enverrons une erreur TRANSPORT_UNAVAILABLE et la promesse sera rejetée. Dans tous les autres cas "réussis", le navigateur redirigera vers le fournisseur OAuth, puis vers votre application, mais l'état antérieur de la promesse n'est plus disponible.

Afin de récupérer votre session d'authentification après une redirection de navigateur réussie, utilisez simplement Auth.$onAuth(function(authData){...}) pour surveiller l'état d'authentification. Lors du premier retour du fournisseur OAuth, le client Firebase sous le capot terminera la création de la session et déclenchera un événement vers le callback passé à onAuth(function(authData){...}) avec l'état d'authentification actuel de l'utilisateur.

En savoir plus sur les méthodes d'authentification Firebase here et les outils d'authentification d'AngularFire here.