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

时间:2017-06-16 15:38:57

标签: node.js reactjs saml-2.0 passport-saml

关于如何解决看似简单的任务,我已经摸不着头脑约2天,但它开始让我发疯。

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

当用户登录时,流程如下:

  1. 用户访问www.server.com/并通过react-application
  2. 获取静态HTML
  3. 用户点击“登录”并访问www.server.com/login
  4. passport-saml将用户重定向到saml身份提供者。用户登录。
  5. 用户在req.body中使用SamlResponse回复www.server.com/callback,该名称由passport-saml解码并放入req.user。
  6. 如果用户尚不存在,我在数据库中创建用户。
  7. 我创建了一个JWT。
  8. 接下来我该怎么办?问题是当从身份提供者回调时用户不在react-application中,所以我在应用程序中丢失了所有状态,因此我回复的任何内容都将被发送到浏览器。

    有什么办法可以强制浏览器给我一个identityprovider回拨的SamlResponse吗?然后我可以将它作为来自react-application的http请求发送到服务器。

2 个答案:

答案 0 :(得分:15)

经过一番思考后,我想出了以下解决方案,对我来说效果很好。

SAML有一个名为RelayState的东西,它是服务提供商必须响应的属性。所以现在这个过程看起来像这样:

  1. 用户访问http://frontendserver.com并使用React应用程序(未登录)获取服务器静态页面。
  2. 用户点击'登录'并被重定向到http://backendserver.com/login/?RelayState=http://frontendserver.com,通过passport-saml进行身份验证并将用户重定向到SP。所以我在RelayState中传递了请求的来源。
  3. 用户使用SamlResponse回拨http://backendserver.com/callback,其中包括RelayState。
  4. 我创建了一个令牌,并将用户重定向到RelayState/#token
  5. 然后我可以解析React应用程序中的url,并将该标记添加为任何进一步请求的标头。
  6. 这似乎是显而易见的方法,但我花了很长时间才弄明白这会起作用。

答案 1 :(得分:0)

我知道这个问题是针对Node后端的,但是我找到了有关PHP / Apache Web服务器后端here的实现的文章,并且我认为它可以帮助某人尝试了解该过程的流程事物类型有效。