Как использовать маршрутизацию с аутентификацией пользователя в Firebase с помощью AngularFire?

В настоящее время я пытаюсь использовать маршрутизацию, чтобы пользователь перенаправлялся на определенную страницу, если он не прошел проверку подлинности, и перенаправлялся на другую страницу, если он прошел проверку подлинности.

Ниже приведен HTML

<html ng-app="sampleApp">
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
    <script src="https://cdn.firebase.com/js/client/2.0.4/firebase.js"></script>
    <script src="https://cdn.firebase.com/libs/angularfire/0.9.1/angularfire.min.js"></script>
    <script src="app.js"></script>
  </head>
  <body ng-controller="SampleCtrl">
    <div ng-show="user">
      <p>Hello, {{ user.facebook.displayName }}</p>
      <button ng-click="auth.$unauth()">Logout</button>
    </div>
    <div ng-hide="user">
      <p>Welcome, please log in.</p>
      <button ng-click="auth.$authWithOAuthPopup('facebook')">Login</button>
    </div>
  </body>
</html>

Ниже находится приложение

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

//Generates the $firebaseAuth instance
app.factory("Auth", ["$firebaseAuth", function($firebaseAuth) {
  var ref = new Firebase("https://crowdfluttr.firebaseio.com/");
  return $firebaseAuth(ref);
}]);

//auth is now used in controller 
app.controller("SampleCtrl", ["$scope", "Auth", function($scope, Auth) {
  $scope.auth = Auth;
  $scope.user = $scope.auth.$getAuth();
}])

//redirects to homepage if $requireAuth rejects
app.run(["$rootScope", "$location", function($rootScope, $location) {
  $rootScope.$on("$routeChangeError", function(event, next, previous, error) {
    if (error === "AUTH_REQUIRED") {
      $location.path("/home");
    }
  });
}]);

//use routeProvider to only load HomeCtrl if $waitroAuth Resolves and returns promise
app.config(["$routeProvider", function($routeProvider) {
  $routeProvider.when("/home", {
    controller: "HomeCtrl",
    templateUrl: "views/home.html",
    resolve: {
      "currentAuth": ["Auth", function(Auth) {
        return Auth.$waitForAuth();
      }]
    }
  }).when("/account", {
   //controller only loaded if $requireAuth resolves
    controller: "AccountCtrl",
    templateUrl: "views/account.html",
    resolve: {
      "currentAuth": ["Auth", function(Auth) {
        return Auth.$requireAuth();
      }]
    }
  });
}]);

//returns the authenticated user from currentAuth or null if not logged in
app.controller("HomeCtrl", ["currentAuth", function(currentAuth) {
}]);

app.controller("AccountCtrl", ["currentAuth", function(currentAuth) {
}]);

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

Мой codepen смотрите здесь: http://codepen.io/chriscruz/pen/ogWyLJ

Кроме того, вот страница для справки, на которой я пытаюсь реализовать: https://www.firebase.com/docs/web/libraries/angular/guide.html#section-routes


person Chris    schedule 21.01.2015    source источник


Ответы (1)


Ваше решение довольно простое, включите библиотеку ngRoute таким образом:

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.10/angular-route.min.js"></script>

в вашей html-головке.

Затем также включите ngRoute в качестве зависимости в ваше приложение, таким образом:

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

Посмотреть решение на codepen: http://codepen.io/christiannwamba/pen/jEmegY

Удачи и С уважением

person Chris    schedule 21.01.2015