Аутентификация SAML2.0 с помощью Node.js и SPA

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

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

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

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

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

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

Ответ 1

После некоторого раздумья я придумал следующее решение, которое отлично поработало для меня.

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

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

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

Ответ 2

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