Я пытаюсь использовать новую Firebase с системой Auth и ограничивать маршруты в своем $routeProvider
через resolves
.AngularJS Routes and Resolve with new Firebase Auth
Однако я не совсем понимаю.
Это то, что у меня есть. В моей .config-функции я определяю маршруты и инициализацию firebase. В моем блоке конфигурации находится следующее.
$routeProvider
.when('/', {
templateUrl: 'templates/dashboard.ejs',
//resolve. this needs restricted
})
.when('/login', {
templateUrl: 'templates/login.ejs'
})
firebase.initializeApp(config);
я нашел на новом DOCS сайте, что эти функции доступны, которые перечислены в моем .run()
блоке для угловой.
.run(function($rootScope, $location) {
$rootScope.authentication = firebase.auth();
/*firebase.auth().onAuthStateChanged(function(user) {
if(user) {
$rootScope.user = user;
} else {
$rootScope.user = false;
$location.path('/login')
}
})*/
var user = firebase.auth().currentUser;
if (user) {
$rootScope.user = user;
} else {
$rootScope.user = false;
console.log('No User!');
$location.path('/login');
}
})
Теперь, что я выше только стреляя every other time
я получить доступ к любому URL на моем сайте.
Итак, мой вопрос: как мне взять то, что находится в моей функции .run(), и превратить его в решение для моего маршрута, поэтому я снова могу ограничить маршруты.
С помощью старой firebase вы просто вызываете $ firebaseAuth(), как показано ниже, и имеете функцию routeChangeError, которая вызывается как следующая.
// In config block. **old way**
$routeProvider
.when('/', {
templateUrl: 'templates/dashboard.ejs',
resolve: {
"currentAuth": ["$firebaseAuth", function($firebaseAuth) {
var ref = new Firebase(fbUrl);
var authObj = $firebaseAuth(ref);
return authObj.$requireAuth();
}]
}
})
И затем routechangeerror в блоке .run().
// .run block **old way**
.run(function($rootScope, $location) {
$rootScope.$on("$routeChangeError", function(event, current, previous, eventObj) {
if (eventObj === 'AUTH_REQUIRED') {
console.log('auth required!');
$location.path("/login");
}
});
})
Это больше не работает, потому что вы не используете $firebaseAuth()
больше. или new Firebase(fbUrl);
.
UPDATE
Я чувствую, что это немного грязный, но, глядя на маршруты чуть больше, я придумал это.
В моем маршруте решимостью:
.when('/', {
templateUrl: 'templates/dashboard.ejs',
resolve: {
userAuthenticated: ["$http", "$q", function($http, $q) {
var deferred = $q;
if(firebase.auth().currentUser) {
deferred.resolve();
} else {
deferred.reject();
console.log('Really!?');
}
return deferred.promise;
}]
}
})
А потом просто routeChangeError.
$rootScope.$on("$routeChangeError", function (event, current, previous, rejection) {
alert("Not authorised");
})
Единственная проблема заключается в том, что она отложена. Возврат возвращается неопределенно. Это не активирует функцию routeChangeError. Хотя мой console.log()
получает вызов.
Может ли это быть потому, что firebase.auth().currentUser
возвращает null, когда ни один пользователь не аутентифицирован?
Я не знаю, какую версию или стороннюю зависимость вы используете, но это не работает вообще для меня и не похоже на то, что я нашел в документации. Когда я пытаюсь загрузить модуль firebase в свое приложение, я получаю сообщение об ошибке, которое не определено. Итак, какую третью сторону вы используете? –
Вы также больше не определяете свой URL-адрес, вы инициализируете firebase, используя блок кода, предоставленный Firebase. Мой вопрос касался не сторонних зависимостей. –
Я работаю над командой Firebase, и я поддерживаю AngularFire. Я написал функции '$ firebaseRefProvider' и' $ firebaseAuthService'. Это способ обработки инъекции зависимостей с помощью ссылок на базы данных. Мы работаем над документами для этого. Проверьте документы github для методов аутентификации: https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md. –