как использовать паспорт SAML с узлом (экспресс) в качестве бэкэнда и vue в качестве клиента - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть приложение с бэкэндом узла (экспресс) и клиентом vue.Я пытаюсь добавить SAML SSO, используя паспорт.(имеет смысл сделать это в приложении узла сервера).

отлично работает при использовании в экспресс-приложении.но когда я применил его к структуре экспресс-бэкэнда и vue-клиента - он не может выполнить перенаправление на Idp.

, когда пользователь заходит на мою страницу входа, vue client (Login.vue) вызывает бэкэнд-узел для проверкиПользователь.(api verifyuser)

вызов узла passport.authenticate ('saml', ...), и я ожидал ответа, который я могу отправить обратно в функцию vue, которая вызвала меня, и там, в Login.vue - длясделать перенаправление.

но возникает проблема: в приложении внутреннего узла ответ на перенаправление отправляется после того, как мой код выполнен, внутри стратегии паспорта.Поэтому он автоматически отправляется в браузер, а не возвращается к сценарию vue, который вызвал этот узел api.

Таким образом, перенаправление выполняется в фоновом режиме, пользователь не видит никакого перенаправления.исходная страница входа по-прежнему отображается.И моя функция vue получает ответ от API - только после того, как браузер отправляет перенаправление (в фоновом режиме) в IDP и получает ответ html-страницы входа в систему от IDP.Таким образом, данные, которые я получаю - это html-страница входа в систему IDP, а не данные перенаправления.

Как я могу это решить?

Я новичок в клиентских технологиях и JS ивключая узел, так что я действительно не знаю, как обрабатывать такой поток.поиск 3 дня для решения.

Большое спасибо за вашу помощь!

вот мои фрагменты кода:

Login.vue:

<input class="button wide cropBottom io-mango ae-5 margin-top-0 toRight" v-on:click="userLogin"  type="button" value="Log In"/>
...
userLogin: function() {
      ...
      ...
        $(".overlay").show();
        this.$http.post(process.env.BASE_URL + "verifyuser", oUser)  //call backend node express app
         .then(function(data) {
               ...
               here I gets only an html login page which the IDP sent as a response to the redirect with the SAML Request.
          }

Экспресс-приложение внутреннего узла:

verifyuser.js:

module.exports = function (app) {
  app.post('/verifyuser', (req, res, next) => {


      var SamlStrategy = passportSaml.Strategy;

      passport.use(new SamlStrategy(
        {  ...
        });

      passport.authenticate('saml', {session: false}, function (err, user, info) {
            ...
            })(req,res,next);


    //tried to get the redirect here, but res still don't have it. only after this function is called, the SAML request is created from the req, and the location url is made.      

     });

1 Ответ

0 голосов
/ 09 января 2019

Я нашел решение.Я изменил клиент Vue: вместо того, чтобы вызывать сервер с помощью ajax и ожидать ответа на запрос данных, я вызывал сервер, используя сообщение формы.таким образом, браузер перенаправляет на сервер, когда я его вызываю, и когда библиотека паспортов на сервере возвращает ответ о перенаправлении - это делается в forground, и пользователь может видеть его.

В Single Logout, passport сделали лучше: API паспорт просто возвращает созданный запрос на выход.затем я сам могу решить, хочу ли я перенаправить с сервера, или я хочу отправить запрос на перенаправление в функцию ожидающего клиента - и выполнить перенаправление оттуда.

...