【问题标题】:SAML2.0 Authentication with Node.js and SPA使用 Node.js 和 SPA 进行 SAML2.0 身份验证
【发布时间】:2017-11-19 11:02:00
【问题描述】:

大约 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 发送到服务器。

【问题讨论】:

  • 海你能分享一些样本我有同样的问题

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 只要通过 https 进行通信就不会。
  • 你能提供一个示例应用吗?
  • 我下次访问网站时如何注销并检查令牌是否有效
  • @ankalal JWT 没有干净的退出方式。我在我的应用程序上所做的是,如果用户单击注销,我只需从 cookie 中删除他们的令牌。如果您需要将用户从服务器注销(比如说删除它们),您必须有一种机制来跟踪服务器上的令牌(例如 db)并使它们无效。
  • 拜托,请您添加更多详细信息。我得到 SAMLResponse 并再次使用 302 状态代码重定向到 web-app,但是由于 302,浏览器阻止了来自 JS 的任何访问。所以这一步“用户使用包含 RelayState 的 SamlResponse 回调backendserver.com/callback”。应该以哪种方式完成?检测重定向?
【解决方案2】:

我知道这个问题是针对 Node 后端的,但是我找到了一篇 PHP/Apache 网络服务器后端实现的文章here,我认为它可以帮助试图理解这种类型的流程的人一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2016-10-21
    • 2023-04-05
    • 1970-01-01
    • 2014-07-23
    • 2018-05-21
    相关资源
    最近更新 更多