4

Я пытаюсь использовать новую 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, когда ни один пользователь не аутентифицирован?

ответ

4

Методы были переименованы в $waitForSignIn() и $requireSignIn.

Вы также можете использовать службу $firebaseRefProvider для настройки URL-адреса вашей базы данных, чтобы он автоматически настраивал $firebaseAuthService.

angular.module('app', ['firebase']) 
    .constant('FirebaseDatabaseUrl', '<my-firebase-url>') 
    .controller('HomeCtrl', HomeController) 
    .config(function($firebaseRefProvider, FirebaseDatabaseUrl, $routeProvider) { 
    $firebaseRefProvider.registerUrl(FirebaseDatabaseUrl); 
    $routeProvider.when("/home", { 
     controller: "HomeCtrl", 
     templateUrl: "views/home.html", 
     resolve: { 
      // controller will not be loaded until $waitForSignIn resolves 
      "firebaseUser": function($firebaseAuthService) { 
      return $firebaseAuthService.$waitForSignIn(); 
      } 
     } 
     }).when("/account", { 
     controller: "AccountCtrl", 
     templateUrl: "views/account.html", 
     resolve: { 
      // controller will not be loaded until $requireSignIn resolves 
      "firebaseUser": function(Auth) { 
      // If the promise is rejected, it will throw a $stateChangeError 
      return $firebaseAuthService.$requireSignIn(); 
      } 
     } 
     }); 
    }); 

function HomeController($scope, $firebaseRef, firebaseUser) { 

} 
+0

Я не знаю, какую версию или стороннюю зависимость вы используете, но это не работает вообще для меня и не похоже на то, что я нашел в документации. Когда я пытаюсь загрузить модуль firebase в свое приложение, я получаю сообщение об ошибке, которое не определено. Итак, какую третью сторону вы используете? –

+0

Вы также больше не определяете свой URL-адрес, вы инициализируете firebase, используя блок кода, предоставленный Firebase. Мой вопрос касался не сторонних зависимостей. –

+0

Я работаю над командой Firebase, и я поддерживаю AngularFire. Я написал функции '$ firebaseRefProvider' и' $ firebaseAuthService'. Это способ обработки инъекции зависимостей с помощью ссылок на базы данных. Мы работаем над документами для этого. Проверьте документы github для методов аутентификации: https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md. –

0

Поэтому я не уверен, что это самый чистый код сокращения на земном шаре, но он работает.

Firebase теперь предоставляет новую функцию для аутентификации текущего пользователя, если таковой имеется. После инициализации firebase у вас есть доступ к этой функции. firebase.auth().currentUser.

(Эта функция возвращает данные пользователя, если зарегистрируетесь и нулевое значение, если нет)

Таким образом, в вашем маршруте, вы можете создать и разрешить обещание на основе результатов этой функции.Обязательно определяют отложила в $q.defer(); (я боролся с этим, как вы можете увидеть в моем обновлении вопроса)

$routeProvider 
    .when('/', { 
      templateUrl: 'templates/dashboard.ejs', 
      resolve: { 
       userAuthenticated: ["$http", "$q", function($http, $q) { 
        var deferred = $q.defer(); 
        if(firebase.auth().currentUser) { 
         deferred.resolve(); 
        } else { 
         deferred.reject('NOT_AUTHORIZED'); 
        } 
        return deferred.promise; 
       }] 
      } 
     }) 

, а затем в пробежки функции для Угловое, вы будете наблюдать за ошибки изменения маршрута.

В приведенной выше функции вы просто наблюдаете за ошибкой в ​​изменении маршрута. Если отклонение равно «NOT_AUTHORIZED» (передано в нашей функции отклонения в функции разрешения), мы перенаправляем пользователя на экран входа в систему, чтобы пройти аутентификацию.

ПРИМЕЧАНИЕ. В этой функции routeChangeError вы можете делать то, что вам нравится, возможно, даже показывать немного рычания, что пользователь не авторизован.