2015-05-31 6 views
1

Я использую expressjs и angularjs для приложения. В принципе, expressjs просто возвращает один .html, который имеет угловое одностраничное приложение. Вся маршрутизация выполняется с помощью angularjs, а expressjs предоставляет только некоторые веб-службы (GET, POST).Express.js и Angular - сеанс аутентификации и регистрации

Итак, если бы я сделал только обычное приложение expressjs, я бы использовал passjs и сохранил пользователя в сеансе на стороне сервера, который бы это был. Когда пользователь пытается получить доступ к страницам/администраторам, я бы использовал паспортное ПО для проверки того, разрешен ли маршрут и т. Д. Легко и просто.

Но с угловыми маршрутами все делается на стороне клиента - даже при оценке того, входит ли пользователь в систему. Теперь, конечно, об этом написано много, но почти все решения хранят любой токен-ключ в localStorage или angular's $cookie. Теперь мне интересно - это безопасно?

Если кто-нибудь запустил такое приложение на общедоступном компьютере и забыл выйти из системы, любой мог бы посмотреть на localStorage или на угловой $cookie и получить токен, не так ли?

Итак, каков теоретический процесс реализации безопасной аутентификации на стороне клиента, используя angularjs?

ответ

0

Я сделал это, создать угловую службу под названием MyAuthentication, которая представляет методы

  • Authenticate (ип, PWD)
  • Выход()

Для того, чтобы получить надлежащее разделение I имеют отдельный пользовательский прокси, который делает мои пользовательские HTTP-запросы.

angular.module('myNgApplication').service('MyAuthentication', function ($rootScope, $cookies, $log, UserProxy) { 

    var self = this; 
    self.user = null ; 

    (function(){ 
     UserProxy.retrieveSession().then(function(authResponse){ 
      self.user = authResponse 
     }, function() { 
      self.user = null 
     }) 
    }).call(this) 

    this.isLoggedIn = function() { 
     return self.user != null ; 
    } 

    this.login = function (email, password) { 
     return UserProxy.login(email, password).then(function(authResponse){ 
      self.user = authResponse 
      return self.user 
     }) 
    } 

    this.logout = function() { 
     return UserProxy.logout().then(function(response){ 
      self.user = null ; 
      return response 
     }) 
    } 

    // this is never used externally. because the HTTP request to gte the user may be in progress when this is called and therefore self.user is null 
    this.getUser = function() { 
     return self.user 
    } 

    this.bootstrapUser = function(callback){ 
     if(self.isLoggedIn()){ 
      callback(self.user) 
     } 
     else { 
      $rootScope.$watch(self.getUser, function(newUser, oldUser) { 
       if(newUser != oldUser) { 
        callback(self.user) 
       } 
      }); 
     } 

    } 

}) 

Объект пользователя остается в памяти все время ... Тогда право может выглядеть примерно так:

angular.module('myNgApplication').service('MyEntitlments', function (MyAuthentication) { 



    this.isEntitled = function(feature) { 

     return MyAuthentication.bootstrapUser(function(user){ 
      // check users role and feature    
      return true || false 
     }) 

    } 

}) 

И на сервере я до сих пор с помощью паспорта.

+0

ok, поэтому это не хранится в файле cookie или localstorage? но что произойдет, если пользователь закроет браузер, а затем вернется на страницу - он должен снова войти в систему, верно? – uglycode

+0

Ну, да. Вы не можете иметь это в обоих направлениях. Другое, что вы можете сделать, это добавить файл cookie, который идентифицирует сеанс на сервере. Единственное, что в cookie пользователя - это идентификатор сеанса. Функция self invoking в службе MyAuthentication пытается получить сеанс ... Таким образом, вы можете что-то там сделать. – akaphenom

+0

Реальность заключается в том, что вам нужно будет либо сохранить что-то локальное, либо потребовать повторного входа в систему, если они закроют браузер. ЕСЛИ вы храните что-то локальное, тогда вам лучше хранить как можно меньше. – akaphenom

3

Цитата:

Таким образом, если бы я сделать просто очередной expressjs приложение, я хотел бы использовать passportjs и магазин пользователя в сессии на стороне сервера, что бы его.

Пока данные сеанса хранятся на сервере, идентификатор сеанса хранится на клиенте в файле cookie. Если cookie украден (например, в примере с открытым компьютером), сеанс может использоваться кем-то другим. Приложения на стороне клиента МОГУТ использовать схему cookie-session-identifier. Когда Angular делает XHR-запросы вашего сервера, он будет поставлять файл cookie.

Как вы видели, JSON Web Tokens (JWT) появились как новая схема. Они заменяют идентификатор сеанса, но не cookie. Вместо этого вы можете использовать локальное хранилище, но это небезопасно. Куки-файлы на самом деле являются самым надежным местом для хранения токена аутентификации, если вы установите флаги HttpOnly; Secure. Это предотвращает чтение JS-среды cookie и предотвращает отправку браузера на сервер по незащищенным каналам.

Я написал о JWTs и угловых приложений в длину, в этих двух статьях:

Build Secure User Interfaces Using JSON Web Tokens (JWTs)

Token Based Authentication for Single Page Apps (SPAs)

Если вы беспокоитесь о публичных компьютерах, вы должны избегать хранения токен вообще. Это означает сохранение маркера в javascript-памяти и поставку его через HTTP-заголовки (обычно Authorization: Bearer <access_tken>). Как только вкладка будет закрыта, токен будет потерян, а сеанс будет мертв. Конечно, это требует, чтобы пользователь закрыл вкладку, чтобы вы могли сделать еще один шаг и установить очень малое время ожидания на токене, например пять минут. Если пользователь не использует токен в течение пяти минут, он считается действительным, и он должен снова войти в систему.

P.S. Я работаю в Stormpath, и у нас есть служба управления пользователями, которая позволяет невероятно легко добавлять аутентификацию в ваши приложения с угловым выражением. Вы можете прочитать об этом в нашем AngularJS Guide

Смежные вопросы