Аутентификация SAML2.0 с помощью Node.js и SPA
Я прочесываю голову примерно на 2 дня, как решить то, что казалось простой задачей, но это начинает сводить меня с ума.
У меня есть приложение, в котором пользователи будут использовать SAML 2.0 для аутентификации. У меня есть приложение-реакция, настроенное для интерфейса, и думал, что я собираюсь использовать JWT, чтобы обеспечить связь rest-api между front-end и backend.
Когда пользователь регистрируется, поток выглядит следующим образом:
- Пользователь обращается к www.server.com/и получает статический HTML-код с реакционным приложением
- Пользователь нажимает "Войти" и обращается к www.server.com/login
- Паспорт-saml перенаправляет пользователя на saml-провайдер идентификации. Пользователь входит в систему.
- Пользователь обращается к www.server.com/callback с помощью SamlResponse в req.body, который декодируется паспорт-saml и помещается в req.user.
- Если пользователь еще не существует, я создаю пользователя в базе данных.
- Я создаю JWT.
Что я должен делать дальше? Проблема заключается в том, что пользователь не находится в реакторе при обратном вызове от поставщика удостоверений, поэтому я потерял все состояние в приложении, поэтому все, что я отвечу, будет отправлено в браузер.
Есть ли способ заставить браузер предоставить мне SamlResponse, с которым отправляется идентификатор? Затем я могу отправить его на сервер в качестве http-запроса из приложения-реакции.
Ответы
Ответ 1
После некоторого раздумья я придумал следующее решение, которое отлично поработало для меня.
В SAML есть что-то, называемое RelayState
которое является собственностью, на которую должен ответить поставщик услуг. Итак, теперь процесс выглядит следующим образом:
- Пользователь обращается к
http://frontendserver.com
и получает статическую страницу сервера с помощью приложения React (не подписан). - Пользователь нажимает "Войти" и перенаправляется на
http://backendserver.com/login/?RelayState=http://frontendserver.com
который аутентифицируется через паспорт-saml и перенаправляет пользователя на SP. Поэтому я передаю происхождение запроса в RelayState. - Пользователь обращается к http://backendserver.com/callback с SamlResponse, который включает RelayState.
- Я создаю токен и перенаправляю пользователя на
RelayState/#token
. - Затем я могу разобрать URL-адрес в приложении React и добавить токен в качестве заголовка для любых последующих запросов.
Это могло показаться очевидным способом сделать это, но мне потребовалось некоторое время, чтобы понять, что это сработает.
Ответ 2
Я знаю, что этот вопрос для узла бэкэндом, но я нашел статью о реализации для PHP/Apache веб - сервера бэкэндом здесь, и я думаю, что это может помочь кто - то пытается понять ход процесса, как такого рода вещи работает.