大约 2 天来,我一直在摸索如何解决看似简单的任务,但它开始让我发疯。
我有一个应用程序,用户将使用 SAML 2.0 进行身份验证。 我为前端设置了一个 react-application,并且正在考虑使用 JWT 来保护前端和后端之间的 rest-api 通信。
当用户登录时,流程如下:
- 用户访问 www.server.com/并通过 react-application 获得静态 HTML
- 用户点击“登录”并访问 www.server.com/login
- passport-saml 将用户重定向到 saml 身份提供者。用户登录。
- 用户通过 req.body 中的 SamlResponse 回调 www.server.com/callback,该 SamlResponse 由 passport-saml 解码并放入 req.user。
- 如果用户不存在,我会在数据库中创建用户。
- 我创建了一个 JWT。
接下来我该怎么做?问题是当从身份提供者回调时用户不在 react 应用程序中,所以我已经丢失了应用程序中的所有状态,所以无论我回复什么都会被发送到浏览器。
有什么方法可以强制浏览器给我身份提供者正在回调的 SamlResponse?然后我可以将它作为来自 react-application 的 http-request 发送到服务器。
最佳答案
经过一番思考,我想出了以下解决方案,对我来说效果很好。
SAML 有一个叫做 RelayState
的东西,它是服务提供者必须响应的属性。所以现在这个过程是这样的:
- 用户访问
http://frontendserver.com
并使用 React 应用程序(未登录)获取服务器静态页面。 - 用户单击“登录”并被重定向到
http://backendserver.com/login/?RelayState=http://frontendserver.com
,后者通过 passport-saml 进行身份验证并将用户重定向到 SP .所以我在 RelayState 中传递了请求的来源。 - 用户回电 http://backendserver.com/callback使用 SamlResponse,其中包括 RelayState。
- 我创建了一个 token ,并将用户重定向到
RelayState/#token
。 - 然后我可以在 React 应用程序中解析 url,并将 token 添加为任何进一步请求的 header 。
这似乎是显而易见的方法,但我花了很长时间才弄清楚这是否可行。
关于node.js - 使用 Node.js 和 SPA 进行 SAML2.0 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44593120/