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

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

大约 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。

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

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

最佳答案

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

SAML 有一个叫做 RelayState 的东西,它是服务提供者必须响应的属性。所以现在这个过程是这样的:

  1. 用户访问 http://frontendserver.com 并使用 React 应用程序(未登录)获取服务器静态页面。
  2. 用户单击“登录”并被重定向到 http://backendserver.com/login/?RelayState=http://frontendserver.com,后者通过 passport-saml 进行身份验证并将用户重定向到 SP .所以我在 RelayState 中传递了请求的来源。
  3. 用户回电 http://backendserver.com/callback使用 SamlResponse,其中包括 RelayState。
  4. 我创建了一个 token ,并将用户重定向到 RelayState/#token
  5. 然后我可以在 React 应用程序中解析 url,并将 token 添加为任何进一步请求的 header 。

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

关于node.js - 使用 Node.js 和 SPA 进行 SAML2.0 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44593120/

相关文章:

amazon-web-services - 如何将 AD FS 组成员资格映射到自定义 AWS Cognito 属性?

javascript - 为什么我在使用 Passport 和 session 时没有保持登录状态? Passport 的 "isAuthenticated()"总是返回 false

javascript - Nodejs多重认证

node.js - 输入 Angular 找不到名称错误

java - 查询字符串未保留在 SAML HTTP 重定向绑定(bind)中

c# - 签名出现在 AttributeStatement 旁边时出现 SAML 2.0 错误 (.Net 4.5)

javascript - 尝试用 Jest 进行模拟时,express 未定义

html - 悬停时顶部导航栏下拉菜单消失得太快 React

javascript - 停止点击父级上的子级调用方法 - React/JavaScript

javascript - 如何根据复选框选择呈现列表?