2012-11-20 19 views
16

Szukam sposobu na zrobienie tych dwóch rzeczy, najpierw chcę przekierować użytkownika na stronę logowania, jeśli nie znaleziono identyfikatora SessionID, a drugi chciałbym usłyszeć opinia o utrzymywaniu ID sesji tylko w pamięci (bez plików cookie).AngularJS - Przekieruj do strony logowania i Persistence of Session ID

Rozwiązanie wpadłem na przekierowanie jest:

1 - Tworzenie usługa nazywa OAuth, że sprawdzi, czy SessionID istnieje, a jeśli nie, przekierowuje do strony logowania, usługa jest również odpowiedzialny za login i metody wylogowania.

app.factory('OAuth', ['$http', function ($http) { 

    var _SessionID = ''; 

    return { 
     login: function() { 
      //Do login ans store sessionID in var _SessionID 
     }, 

     logout: function() { 
      //Do logout 
     }, 

     isLoggedIn: function() { 
      if(_SessionID) { 
       return true; 
      } 
      //redirect to login page if false 
     } 
    }; 

}]); 

2 - wstrzyknąć nową usługę OAuth w każdym kontrolerze i sprawdzić, czy użytkownik isLoggedIn

app.controller('myCtrl', ['$scope', 'OAuth', function ($scope, OAuth) { 

    //check if user is logged 
    OAuth.isLoggedIn(); 

}]); 

Pytania:

1 - Metoda isLoggedIn() zostanie wywołana w wszystkich kontrolerów, tak Zastanawiam się, czy istnieje sposób, aby to zrobić bez wstrzykiwania usługi i wywoływania jej w każdym kontrolerze.

2 - Zamiast posiadania pliku cookie do przechowywania identyfikatora sesji, chcę zapisać go w zmiennej _SessionID OAuth i dla każdego żądania wysłać ją do serwera. Czy jest to podejście opłacalne/bezpieczne? Czy możesz mi podać jakieś pomysły?

Dzięki!

Odpowiedz

8

Chciałbym rozpocząć here, Witold stworzył ten fajny przechwytywacz, który działa off odpowiedzi http. Używam go i jest bardzo pomocny.

+0

Nicei. Dzięki za cynk Dan! – Bema

+1

Bardzo pomocne jest również [napis o podejściu] (http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application). –

9

Używam podobnej strategii (przechwytywanie 401 odpowiedzi z serwera). Możesz sprawdzić pełną przykład tutaj: https://github.com/Khelldar/Angular-Express-Train-Seed

Wykorzystuje węzła i mobgodb na backend dla sklepu sesji i okrojone http przechwytujących na kliencie, który doens't ponowić żądania jak ten Dan umieszczony powyżej:

var interceptor = ['$q', '$location', '$rootScope', function ($q, $location, $rootScope) { 
     function success(response) { 
      return response; 
     } 

     function error(response) { 
      var status = response.status; 
      if (status == 401) { 
       $location.path('/login'); 
      } 
      return $q.reject(response); 
     } 

     return function (promise) { 
      return promise.then(success, error); 
     } 
    }]; 
    $httpProvider.responseInterceptors.push(interceptor); 
1

W moim przypadku użyłem

  1. przechwytywania z $ httpProvider
  2. config
  3. i $ okno zależeć ency, ponieważ lokalizacja $ $ dodała ścieżkę do istniejącego adresu URL. Co się stało, było jak „http://www.tnote.me/#/api/auth” i powinien on bene jak „http://www.tnote.me/auth

Fragment kodu jest jak poniżej.

noteApp = angular.module('noteApp', ['ngRoute', 'ngCookies']) 
    .factory('authInterceptor', ['$rootScope', '$q', '$cookies', '$window', 
    function($rootScope, $q, $cookies, $window) { 
     return { 
     request: function (req) { 
      req.headers = req.headers || {}; 
      if ($cookies.token) { 
      req.headers.Authorization = 'Bearer ' + $cookies.token; 
      } 

      return req; 
     }, 
     responseError: function (rejection) { 
      if (rejection.status == 401) { 
      $window.location = '/auth';  
      } 

      return $q.reject(rejection); 
     } 
     } 
    }]) 
    .config(['$routeProvider', '$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('authInterceptor'); 
    } 
    ]) 
0

to będzie działać. To działa dobrze w mojej aplikacji

var interceptor = function ($q, $location) { 
     return { 
      request: function (config) {//req 
       console.log(config); 
       return config; 
      }, 

      response: function (result) {//res 
       console.log('Repos:'); 
       console.log(result.status); 
       return result; 
      }, 

      responseError: function (rejection) {//error 
       console.log('Failed with', rejection.status, 'status'); 
       if (rejection.status == 403) { 
        $location.url('/dashboard'); 
       } 

       return $q.reject(rejection); 
      } 
     } 
    }; 
    module.config(function ($httpProvider) { 
     $httpProvider.interceptors.push(interceptor); 
    }); 
Powiązane problemy