1

我有一个带有节点(快速)后端和 vue 客户端的应用程序。我正在尝试使用护照添加 SAML SSO。(在服务器节点应用程序上执行此操作很有意义)。

在快递应用程序中使用时效果很好。但是当我将它应用于快速后端和 vue 客户端的结构时 - 它无法重定向到 Idp。

当用户进入我的登录页面时,vue 客户端(Login.vue)调用节点后端来验证用户。(api 验证用户)

节点调用 passport.authenticate('saml', ...) 并且我希望可以将响应发送回调用我的 vue 函数,然后在 Login.vue 中进行重定向。

但是问题来了:在后端节点应用程序中,重定向响应是在我的代码执行后发送的,在护照策略中。所以它会自动发送到浏览器,而不是返回到调用这个节点 api 的 vue 脚本。

所以重定向是在后台完成的,用户看不到任何重定向。仍然显示原始登录页面。并且我的 vue 函数从 API 获取响应 - 只有在浏览器将重定向(在后台)发送到 IDP 并从 IDP 获取登录 html 页面响应之后。所以我得到的数据 - 是 IDP 登录页面的 html,而不是重定向数据。

我该如何解决?

我是客户端技术和 js 和节点的新手,所以我真的不知道应该如何处理这样的流程。寻找3天的解决方案。

非常感谢您的帮助!

这是我的代码片段:

登录.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.
          }

后端节点快递应用:

验证用户.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.      

     });
4

1 回答 1

1

我找到了解决方案。我更改了 Vue 客户端:我没有使用 ajax 调用服务器并期望返回数据响应,而是使用表单发布调用服务器。这样,当我调用它时,浏览器会重定向到服务器,并且当服务器中的护照库返回重定向响应时 - 它是在前台完成的,用户可以看到它。

在 Single logout 中,passport 做得更好:passport API 只返回创建的注销请求。然后我可以自己决定是否要从服务器重定向,或者我想将重定向请求发送到等待的客户端功能 - 并从那里进行重定向。

于 2019-01-09T14:17:16.980 回答