При нажатии на кнопку входа через 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 проблема была решена. Надеюсь, что это помогает другим, кто может столкнуться с подобной проблемой.