Как обезопасить угловые маршруты с Firebase v3?

Я хочу защитить различные маршруты на своем сайте, используя Firebase V3, AngularJS и ui.router.

Это похоже на похожую проблему. Я следовал инструкциям этого поста, но он не работает для меня.

Что я ожидаю, что произойдет: при нажатии на ссылку FAQ я должен быть перенаправлен на страницу входа в систему, если он вышел из системы, и должен отобразить страницу FAQ при входе в систему.

Что на самом деле происходит: страница часто задаваемых вопросов вообще не доступна. Вход в систему не имеет никакого значения. Он также не перенаправляет меня на страницу входа при выходе.

Я получаю эту ошибку в моем run функция.

ReferenceError: Firebase is not defined(…)       

Я включил AngularFire на странице, если я не получаю ошибку инжектора модуля, даже если я удаляю Firebase из массива зависимостей.

var app = angular.module('app', ['ui.router', 'firebase']);
app.constant('FirebaseDatabaseUrl', 'https://myfbdb.firebaseio.com');
app.config(function($stateProvider, $urlRouterProvider, $firebaseRefProvider, FirebaseDatabaseUrl) {
    $firebaseRefProvider.registerUrl(FirebaseDatabaseUrl);
// If a route other than status is requested,
// go to the auth route
//$urlRouterProvider.otherwise('/logintest/login');

$stateProvider
    .state('login', {
        url: '/login',
        templateUrl: 'pages/login.html',
        controller: 'LoginController as login'
    })

    .state('faq', {
        url: '/faq',
        templateUrl: 'pages/faq.html',
        controller: 'FaqController as faq',
        resolve: {
          // controller will not be loaded until $requireSignIn resolves
          "firebaseUser": ["$firebaseAuthService", function($firebaseAuthService) {
            console.log('waitForSignIn')
                    // $waitForSignIn returns a promise so the resolve waits for it to complete
                    return $firebaseAuthService.$waitForSignIn();
            }]
          } 

    })
    .state('about', {
        url: '/about',
        templateUrl: 'pages/about.html',
        controller: 'AboutController as about',
        resolve: {
          // controller will not be loaded until $requireSignIn resolves
          "firebaseUser": ["$firebaseAuthService", function($firebaseAuthService) {
            // If the promise is rejected, it will throw a $stateChangeError
            return $firebaseAuthService.$requireSignIn();
          }]
        }           
    })

});



app.controller('FaqController', ['$scope', 'firebaseUser', function($scope, firebaseUser){
console.log('faq')
}]);





app.run(["$rootScope", "$state", function($rootScope, $state) {
  console.log('run');
  $rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
 // We can catch the error thrown when the $requireSignIn promise is rejected
 // and redirect the user back to the home page
 if (error === "AUTH_REQUIRED") {
    console.log('redirecting to login page')
   $state.go("login");
 }
 });
  }]);

1 ответ

Решение

Версии AngularFire 2.0+ совместимы с Firebase 3.0. Все, что ниже AngularFire 2.0, предназначено для устаревшей версии Firebase.

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