15

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

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

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

  1. 用户访问 www.server.com/ 并通过 react-application 获得静态 HTML
  2. 用户单击“登录”并访问 www.server.com/login
  3. passport-saml 将用户重定向到 saml 身份提供者。用户登录。
  4. 用户使用 req.body 中的 SamlResponse 回调 www.server.com/callback,该 SamlResponse 由 passport-saml 解码并放入 req.user。
  5. 如果用户不存在,我在数据库中创建用户。
  6. 我创建了一个 JWT。

接下来我该怎么办?问题是当从身份提供者回调时用户不在反应应用程序中,所以我已经丢失了应用程序中的所有状态,所以无论我回复什么都会被发送到浏览器。

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

4

2 回答 2

20

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

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,并将令牌添加为任何进一步请求的标头。

这似乎是显而易见的方法,但我花了很长时间才弄清楚这是否可行。

于 2017-06-19T14:16:58.507 回答
0

我知道这个问题是针对 Node 后端的,但我在这里找到了一篇关于 PHP/Apache 网络服务器后端实现的文章,认为它可以帮助试图理解这类事情如何工作的流程的人。

于 2019-07-01T09:06:24.717 回答