使用 Node.js 和 SPA 的 SAML2.0 身份验证
SAML2.0 Authentication with Node.js and SPA
我已经为如何解决看似简单的任务绞尽脑汁大约 2 天了,但它开始让我抓狂。
我有一个应用程序,用户将在其中使用 SAML 2.0 进行身份验证。
我为前端设置了一个反应应用程序,我想我会使用 JWT 来保护前端和后端之间的其余 api 通信。
当用户登录时,流程如下:
- 用户访问 www.server.com/ 并使用 react-application
获取静态 HTML
- 用户点击 'Sign in' 并访问 www.server。com/login
- passport-saml 将用户重定向到 saml 身份提供者。用户登录。
- 用户通过 req.body 中的 SamlResponse 回调到 www.server.com/callback,它被 passport-saml 解码并放入 req.user.
- 如果用户不存在,我会在数据库中创建用户。
- 我创建了一个 JWT。
接下来我该做什么?问题是当从身份提供者回调时用户不在反应应用程序中,所以我丢失了应用程序中的所有状态,所以无论我回复什么都会发送到浏览器。
有什么方法可以强制浏览器给我 IdentityProvider 用来回调的 SamlResponse?然后我可以将它作为来自反应应用程序的 http 请求发送到服务器。
经过一番思考,我想出了以下解决方案,对我来说效果很好。
SAML 有一个叫做 RelayState
的东西,它是服务提供商必须响应的 属性。所以现在过程看起来像这样:
- 用户访问
http://frontendserver.com
并使用 React 应用程序(未登录)获取服务器静态页面。
- 用户单击 'Login' 并被重定向到
http://backendserver.com/login/?RelayState=http://frontendserver.com
,后者通过 passport-saml 进行身份验证并将用户重定向到 SP。所以我在 RelayState 中传递了请求的来源。
- 用户使用包含 RelayState 的 SamlResponse 回调 http://backendserver.com/callback。
- 我创建了一个令牌,并将用户重定向到
RelayState/#token
。
- 然后我可以在 React 应用程序中解析 url,并将令牌添加为 header 以用于任何进一步的请求。
这似乎是一种显而易见的方法,但我花了很长时间才弄清楚这是否可行。
我知道这个问题是针对 Node 后端的,但我找到了一篇关于 PHP/Apache 网络服务器后端 here 实现的文章,我认为它可以帮助那些试图了解流程的人这类事情如何运作的过程。
我已经为如何解决看似简单的任务绞尽脑汁大约 2 天了,但它开始让我抓狂。
我有一个应用程序,用户将在其中使用 SAML 2.0 进行身份验证。 我为前端设置了一个反应应用程序,我想我会使用 JWT 来保护前端和后端之间的其余 api 通信。
当用户登录时,流程如下:
- 用户访问 www.server.com/ 并使用 react-application 获取静态 HTML
- 用户点击 'Sign in' 并访问 www.server。com/login
- passport-saml 将用户重定向到 saml 身份提供者。用户登录。
- 用户通过 req.body 中的 SamlResponse 回调到 www.server.com/callback,它被 passport-saml 解码并放入 req.user.
- 如果用户不存在,我会在数据库中创建用户。
- 我创建了一个 JWT。
接下来我该做什么?问题是当从身份提供者回调时用户不在反应应用程序中,所以我丢失了应用程序中的所有状态,所以无论我回复什么都会发送到浏览器。
有什么方法可以强制浏览器给我 IdentityProvider 用来回调的 SamlResponse?然后我可以将它作为来自反应应用程序的 http 请求发送到服务器。
经过一番思考,我想出了以下解决方案,对我来说效果很好。
SAML 有一个叫做 RelayState
的东西,它是服务提供商必须响应的 属性。所以现在过程看起来像这样:
- 用户访问
http://frontendserver.com
并使用 React 应用程序(未登录)获取服务器静态页面。 - 用户单击 'Login' 并被重定向到
http://backendserver.com/login/?RelayState=http://frontendserver.com
,后者通过 passport-saml 进行身份验证并将用户重定向到 SP。所以我在 RelayState 中传递了请求的来源。 - 用户使用包含 RelayState 的 SamlResponse 回调 http://backendserver.com/callback。
- 我创建了一个令牌,并将用户重定向到
RelayState/#token
。 - 然后我可以在 React 应用程序中解析 url,并将令牌添加为 header 以用于任何进一步的请求。
这似乎是一种显而易见的方法,但我花了很长时间才弄清楚这是否可行。
我知道这个问题是针对 Node 后端的,但我找到了一篇关于 PHP/Apache 网络服务器后端 here 实现的文章,我认为它可以帮助那些试图了解流程的人这类事情如何运作的过程。