При нажатии на кнопку входа через Facebook/ персону с помощью angularFire v0.5.0 ($firebaseAuth) пользователь сразу же перенаправляется на "/". Почему?

Моя проблема проста, все в этом коде работает должным образом, за исключением того, что каждый раз, когда я нажимаю кнопку входа в систему, меня перенаправляют на "/". Я не хочу этого. Я хочу, чтобы пользователь оставался на странице входа в систему до тех пор, пока он не завершит аутентификацию через facebook / persona / twitter, а затем не будет перенаправлен на "/ content".

Вот мой роутер / приложение / контроллеры:

var app = angular.module("myapp", ["ngRoute","firebase"]);

      app.config(['$routeProvider',function($routeProvider){

        $routeProvider.when('/',{
            templateUrl: 'landing.html',
        });

        $routeProvider.when('/login',{
            templateUrl: 'login.html',
            controller: 'controller'
        });

        $routeProvider.when('/content',{
            authRequired: true,
            templateUrl: 'content.html',
            controller: 'MyController'
        });

        $routeProvider.otherwise({redirectTo: '/'});

    }]);



      app.controller('MyController',['$scope', '$firebase','$firebaseAuth',function($scope,$firebase,$firebaseAuth) {


        var ref = new Firebase("https://mybase.firebaseio.com/");
        $scope.auth = $firebaseAuth(ref,{path: '/'});
        $scope.messages = $firebase(ref);
        $scope.addMessage = function(e) {
          if (e.keyCode != 13) return;
          $scope.messages.$add({from: $scope.name, body: $scope.msg});
          $scope.msg = "";
        };

      }]);

      app.controller('controller',['$scope','$firebaseAuth',function($scope, $firebaseAuth) {

            var ref = new Firebase('https://mybase.firebaseio.com/');
            $scope.auth = $firebaseAuth(ref);



        }]);

Это (мое предпочтительное решение) не сработало:

.controller('LoginCtrl',['$scope','$firebase','$firebaseAuth','$location',function($scope,$firebase,$firebaseAuth,$location, waitForAuth){
                     var ref = new Firebase('https://myfirebase.firebaseio.com/');
                 $scope.auth = $firebaseAuth(ref,{path: '/'});        
                 waitForAuth.then(function(user){
                     $location.path('/content');
                 })

             }])

Мой div / button выглядит следующим образом (у меня также есть аналогичный, но с 'persona'.):

<div ng-controller="controller">

            <div class="facebook-login">
                <a href="#" ng-hide="auth.user" ng-click="auth.$login('facebook')"><span><i class="fa fa-facebook-square fa-lg"></i> LogIn with Facebook</span></a>
            </div>
            <div class="facebook-login">
                <a href="#" ng-hide="auth.user" ng-click="auth.$login('persona')"><span><i class="fa fa-facebook-square fa-lg"></i> LogIn with Persona</span></a>
            </div>

    </div>

Я включил следующее в мой HTML:

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>    
<script src="//cdn.firebase.com/v0/firebase.js"></script>
<script src="//cdn.firebase.com/v0/firebase-simple-login.js"></script>
<script src="//cdn.firebase.com/libs/angularfire/0.5.0/angularfire.min.js"></script>
<script src="//code.angularjs.org/1.2.6/angular-route.js"></script>
<script src="js/app.js"></script>
<script src="js/module.waitForAuth.js"></script>
<script src="//login.persona.org/include.js"></script>
<script src="app.js"></script>

Я включил регистрацию в Facebook и персону в моей базе Firebase. Кроме того, я добавил свой идентификатор приложения Facebook и секрет тоже. Каждый раз, когда я нажимаю на кнопку входа, я перенаправляюсь на '/'. waitforAuth я использую здесь: https://gist.github.com/katowulf/7328023, но если я использую его в моих контроллерах, вход в систему с помощью кнопок facebook / persona вообще не работает. Если я использую waitForAuth, каждый раз, когда я нажимаю на одну из кнопок входа в систему, меня сразу же перенаправляют на "/" вместо всплывающего окна входа в систему.

Кто-нибудь?:)

2 ответа

Решение

Я наконец нашел решение своей проблемы. Добавление следующего прекращает автоматическое перенаправление на "/" еще до того, как произойдет вход в систему

Мне просто нужно было добавить это:

$scope.$on('$locationChangeStart', function(event) {
                event.preventDefault();
              });

Здесь вот так:

app.controller('controller',['$scope','$firebaseAuth','$location','$rootScope',function($scope, $firebaseAuth,$location,$rootScope) {

            $scope.$on('$locationChangeStart', function(event) {
                event.preventDefault();
              });

            var ref = new Firebase('https://mybase.firebaseio.com/');
            $scope.auth = $firebaseAuth(ref);
            $rootScope.$on('$firebaseAuth:login', function(){
                $location.path('/content');

            });

        }]);

Однако я столкнулся с другой проблемой, потому что теперь это не работает:

$rootScope.$on('$firebaseAuth:login', function(){
                    $location.path('/content');

Потому что после того, как пользователь завершит аутентификацию, он должен быть перенаправлен в /content (вместо того, чтобы застревать на странице входа в систему, когда кнопки входа в систему исчезают из-за ng-hide (см. Выше)), но это не имеет значения, что я пытаюсь $location.path('/content') не работает.

Я попробовал это:

waitForAuth.then(function(){
                  console.log('test');
                  $location.path('/content');
              })

Но console.log выводит "test" в консоли до того, как пользователь проходит аутентификацию, поэтому waitForAuth, похоже, тоже не работает: /. Каким-то образом waitForAuth запускает console.log, но не запускает $ location.path... Странно.

Я даже попытался сделать это (как с waitForAuth, так и с $ rootScope. $ On:

waitForAuth.then(function(){
                      console.log('test');
                      $location.path('/content');
                      $scope.$apply();
                  })

Но я просто получаю сообщение об ошибке, что angular $ digest уже выполняется.

Добавление этого: ng-click="auth.$login('facebook'); return false;" вот так, angular выдает мне эту ошибку:

Error: [$parse:syntax] Syntax Error: Token 'false' is an unexpected token at column 33 of the expression [auth.$login('facebook'); return false;] starting at [false;].

И кнопки входа становятся неактивными...:(

Ооо дорогой... я:)

У меня была та же проблема, когда URL всегда возвращался на домашнюю страницу. Проблема была вызвана простой ошибкой в ​​синтаксисе html:

<a href="#" ng-click="logout()">Log out</a>

После удаления # в атрибуте href проблема была решена. Надеюсь, что это помогает другим, кто может столкнуться с подобной проблемой.

Другие вопросы по тегам