2012-11-20 13 views
16

Sto cercando un modo per fare queste due cose, prima voglio reindirizzare l'utente a una pagina di accesso se non viene trovato SessionID e in secondo luogo vorrei sentire la tua opinione sull'ID sessione persistente solo in memoria (nessun cookie).AngularJS - Reindirizza alla pagina di accesso e Persistenza dell'ID sessione

La soluzione mi è venuta per il reindirizzamento è:

1 - Creazione di un servizio chiamato OAuth che controllerà se SessionID esiste e se non, reindirizza alla pagina di login, il servizio è anche responsabile per l'accesso e la metodi di logout.

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 - Iniettare il nuovo servizio di OAuth in ogni controller e verificare se l'utente isLoggedIn

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

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

}]); 

Domande:

1 - Il metodo isLoggedIn() sarà chiamato in tutti i controller, in modo Mi chiedo se c'è un modo per farlo senza dover iniettare il servizio e chiamarlo in ogni controller.

2 - Invece di avere un cookie per memorizzare l'ID sessione, voglio salvarlo nella variabile _SessionID di OAuth e per ogni richiesta inviarlo al server. È un approccio fattibile/sicuro? Puoi darmi qualche idea per questo?

Grazie!

risposta

8

Vorrei iniziare here, Witold ha creato questo interessante interceptor che funziona via delle risposte http. Lo uso ed è stato davvero utile.

+0

Nice. Grazie per il suggerimento Dan! – Bema

+1

Anche la [scrittura sull'approccio] (http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application) è molto utile. –

9

Uso una strategia simile (intercettando 401 risposte dal server). È possibile controllare l'esempio completo qui: https://github.com/Khelldar/Angular-Express-Train-Seed

Esso utilizza nodo e mobgodb sul backend per negozio di sessione e un rifilato giù http intercettore sul client che doens't riprovare domande come quella Dan legati sopra:

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

Nel mio caso, ho usato

  1. intercettore con $ httpProvider
  2. config
  3. e $ finestra dipendono ency, come $ posizione ha appena aggiunto il percorso all'URL esistente. Quello che è successo è stato come "http://www.tnote.me/#/api/auth", e avrebbe dovuto trarre beneficio come "http://www.tnote.me/auth"

Il frammento di codice è come questo.

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

questo funzionerà. Funziona perfettamente nella mia applicazione

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); 
    }); 
Problemi correlati