Архитектура для системы входа в стек MEAN?

Я разрабатываю веб-приложение в стеке MEAN (MongoDB, Express, AngularJS и node.js). Я разрабатываю систему входа в систему и также буду защищать некоторые из маршрутов Angular, чтобы к ним могли обращаться только зарегистрированные пользователи. Я пытаюсь придумать, как лучше подойти к архитектуре этого.

Я думаю о текущем рабочем процессе:

  • Пользователь регистрируется через форму AngularJS, которая отправляет http POST в конечную точку Express. Конечная точка проверяет пользователя против базы данных и отвечает на токен OAuth, а также на файл cookie. Оба они хранятся в базе данных mongo для последующей проверки.
  • Как только AngularJS получит ответ на вход, он сохраняет полученный файл cookie с помощью ng файлов cookie и сохраняет токен OAuth в службе пользователя.
  • Каждый раз, когда маршрут изменяется в AngularJS, служба User используется, чтобы убедиться, что файл cookie по-прежнему является законным, сравнивая его с файлами cookie в базе данных mongo (это будет вызов API с помощью Angular). это создало бы заметное отставание?)
  • Когда пользователь нажимает "выйти из системы" или срок действия файла cookie истекает, маркер файла cookie и OAuth оба удаляются из базы данных и больше не будут действительны.

Имеет ли смысл этот подход? Является ли он безопасным и будет ли он относительно эффективным/быстрым в исполнении?

Ответы

Ответ 1

В итоге я объединил свой оригинальный рабочий процесс с примером Express auth, увиденным здесь. Это выглядит так:

  • Когда пользователь изначально загружает приложение, HTTP-вызов выполняется в конечную точку Express, которая проверяет, существует ли уже сеанс для пользователя. Если это так, пользователь хранится в $rootScope и считается зарегистрированным.
  • В любое время, когда изменяется маршрут AngularJS, открывается одна и та же конечная точка. Защита маршрута была указана таким образом, как описано здесь здесь. Если конечная точка когда-либо возвращается, что сеанс не существует, $rootScope.user не устанавливается (если это необходимо), и пользователь перенаправляется на страницу входа.
  • Когда форма входа обрабатывается, она отправляется в конечную точку Express. Конечная точка извлекает пользователя из mongoDB (если он существует) и пытается хешировать пароль. Если это совпадение, пользовательский сеанс установлен, сохраняется в БД mongo, а конечная точка возвращает объект user (используемый для хранения в $rootScope, как упоминалось ранее).
  • В любое время, когда будут доступны какие-либо дополнительные конечные точки, функции сначала передаются через функцию restrict, которая гарантирует, что сеанс существует до отправки каких-либо данных клиенту. Он возвращает 401, если сеанс не существует, который затем обрабатывается со стороны Angular, используя этот HTTP-перехватчик, чтобы отключить $rootScope.user и перенаправить на экран входа в систему.
  • Когда пользователь нажимает "выйти из системы" на стороне Angular, сеанс отключается и удаляется из базы данных mongo, $rootScope.user имеет значение null, а пользователь перенаправляется обратно на главную страницу.