使用Node.js和SPA进行SAML2.0身份validation

我已经为了解决这个看起来很简单的任务而头痛了大约2天,但是开始让我发疯。

我有一个应用程序,用户将使用SAML 2.0进行身份validation。 我为前端设置了一个反应应用程序,并且认为我将使用JWT来确保前端和后端之间的其余api通信。

当用户login时,stream程如下:

  1. 用户访问www.server.com/并通过反应应用程序获取静态HTML
  2. 用户点击“login”并访问www.server.com/login
  3. passport-saml将用户redirect到saml身份提供者。 用户login。
  4. 用户使用req.body中的SamlResponse调用www.server.com/callback,它由passport-saml解码并放入req.user。
  5. 如果用户不存在,我在数据库中创build用户。
  6. 我创build了一个智威汤逊

接下来我应该做什么? 问题是用户在从身份提供者callback时没有处于反应应用程序,所以我已经在应用程序中失去了所有的状态,所以我回复的任何东西都会被发送到浏览器。

有什么办法可以强制浏览器给我的身份提供者回拨的SamlResponse? 然后,我可以将它作为来自react-application的http请求发送到服务器。

经过一番思考,我想出了以下解决scheme,对我来说工作得非常好。

SAML有一个名为RelayState东西,它是服务提供商必须回应的属性。 所以现在这个过程如下所示:

  1. 用户访问http://frontendserver.com并通过React应用程序(未login)获取服务器的静态页面。
  2. 用户点击“login”,并redirect到http://backendserver.com/login/?RelayState=http://frontendserver.com ,通过passport-saml进行身份validation并将用户redirect到SP。 所以我在RelayState中传递请求的来源。
  3. 用户使用SamlResponse调用回http://backendserver.com/callback ,其中包括RelayState。
  4. 我创build一个令牌,并将用户redirect到RelayState/#token
  5. 然后,我可以parsingReact应用程序中的URL,并将该标记添加为任何进一步请求的标头。

这似乎是明显的做法,但是我花了相当长的时间才弄清楚这样做会起作用。