Аутентификация SAML2.0 с Node.js и SPA

Уже 2 дня ломаю голову, как решить, казалось бы, простую задачу, но это начинает сводить меня с ума.

У меня есть приложение, в котором пользователи будут использовать SAML 2.0 для аутентификации. У меня есть приложение для реагирования, настроенное для внешнего интерфейса, и я думал, что собираюсь использовать JWT для защиты связи rest-api между интерфейсом и бэкэндом.

Когда пользователь входит в систему, процесс выглядит следующим образом:

  1. Пользователь получает доступ к www.server.com/ и получает статический HTML-код с помощью приложения-реакции.
  2. Пользователь нажимает «Войти» и получает доступ к www.server.com/login.
  3. паспорт-самл перенаправляет пользователя к провайдеру идентификации saml. Пользователь входит в систему.
  4. Пользователь перезванивает на www.server.com/callback с ответом SamlResponse в req.body, который декодируется с помощью паспорта-saml и помещается в req.user.
  5. Если пользователь еще не существует, я создаю пользователя в базе данных.
  6. Я создаю JWT.

Что я должен делать дальше? Проблема в том, что пользователь не находится в приложении реагирования при обратном вызове от поставщика удостоверений, поэтому я потерял все состояние в приложении, поэтому все, что я отвечаю, будет отправлено в браузер.

Есть ли способ заставить браузер дать мне SamlResponse, с которым перезванивает поставщик идентификации? Затем я мог бы отправить его на сервер в виде http-запроса из реагирующего приложения.


person Stian Bakken    schedule 16.06.2017    source источник
comment
Привет, можешь поделиться образцом, у меня тот же вопрос   -  person ankalal    schedule 29.03.2019


Ответы (2)


Немного подумав, я пришел к следующему решению, которое меня вполне устроило.

В SAML есть нечто, называемое RelayState, которое является свойством, с которым должен отвечать поставщик услуг. Итак, теперь процесс выглядит так:

  1. Пользователь обращается к http://frontendserver.com и получает на сервер статическую страницу с приложением React (без входа в систему).
  2. Пользователь нажимает «Войти» и перенаправляется на http://backendserver.com/login/?RelayState=http://frontendserver.com, который аутентифицируется через паспорт-самл и перенаправляет пользователя на SP. Поэтому я передаю источник запроса в RelayState.
  3. Пользователь перезванивает на http://backendserver.com/callback с помощью SamlResponse, который включает RelayState.
  4. Я создаю токен и перенаправляю пользователя на RelayState/#token.
  5. Затем я могу проанализировать URL-адрес в приложении React и добавить токен в качестве заголовка для любых дальнейших запросов.

Это могло показаться очевидным способом сделать это, но мне потребовалось довольно много времени, чтобы понять, что это сработает.

person Stian Bakken    schedule 19.06.2017
comment
Нет, пока связь осуществляется через https. - person Stian Bakken; 23.05.2018
comment
Можете ли вы предоставить образец приложения, пожалуйста? - person Manoj; 20.01.2019
comment
как выйти из системы и проверить, действителен ли токен, когда я в следующий раз зайду на сайт - person ankalal; 01.04.2019
comment
У @ankalal JWT нет простого способа выйти из системы. Что я делаю в своем приложении, так это то, что если пользователь нажимает «Выход», я просто удаляю его токен из файлов cookie. Если вам нужно вывести пользователя с сервера (скажем, удалить его), вам потребуется механизм, который отслеживает токены на сервере (например, db) и делает их недействительными. - person Svet Angelov; 29.05.2019
comment
Пожалуйста, не могли бы вы добавить больше деталей, пожалуйста. Я получаю SAMLResponse и снова перенаправляюсь в веб-приложение с кодом состояния 302, но браузер блокирует любой доступ из JS из-за 302. Таким образом, на этом шаге пользователь выполняет обратный вызов backendserver.com/callback с ответом SamlResponse, который включает RelayState. каким образом надо сделать? Обнаружить перенаправление? - person Eugene Shmorgun; 13.01.2020

Я знаю, что этот вопрос касается серверной части Node, но я нашел статью о реализации для серверной части веб-сервера PHP/Apache здесь, и я думаю, что это может помочь кому-то, кто пытается понять ход процесса того, как работает этот тип вещей .

person Iruku Kagika    schedule 01.07.2019