作者:听天由命____497 | 来源:互联网 | 2023-02-01 08:43
关于如何解决看似简单的任务,我一直在摸不着头脑约2天,但它开始让我发疯.
我有一个应用程序,用户将使用SAML 2.0进行身份验证.我为前端设置了一个反应应用程序,并且认为我将使用JWT来确保前端和后端之间的rest-api通信.
当用户登录时,流程如下:
用户访问www.server.com/并通过react-application获取静态HTML
用户点击"登录"并访问www.server.com/login
passport-saml将用户重定向到saml身份提供者.用户登录.
用户在req.body中使用SamlResponse回访www.server.com/callback,该版本由passport-saml解码并放入req.user.
如果用户尚不存在,我在数据库中创建用户.
我创建了一个JWT.
接下来我该怎么办?问题是,当从身份提供者回调时,用户不在react-application中,因此我已经丢失了应用程序中的所有状态,因此我回复的任何内容都将被发送到浏览器.
有什么办法可以强制浏览器给我一个identityprovider回拨的SamlResponse吗?然后我可以将它作为来自react-application的http请求发送到服务器.
1> Stian Bakken..:
经过一番思考,我想出了以下解决方案,对我来说效果很好.
SAML有一些叫做RelayState
服务提供商必须响应的属性.所以现在这个过程看起来像这样:
用户访问http://frontendserver.com
并使用React应用程序(未登录)获取服务器静态页面.
用户单击"登录"并http://backendserver.com/login/?RelayState=http://frontendserver.com
通过passport-saml 重定向到进行身份验证,并将用户重定向到SP.所以我在RelayState中传递请求的来源.
用户使用包含RelayState的SamlResponse 回叫http://backendserver.com/callback.
我创建一个令牌,并将用户重定向到RelayState/#token
.
然后,我可以解析React应用程序中的url,并将该标记添加为任何进一步请求的标头.
这似乎是显而易见的方法,但我花了很长时间才弄清楚这会起作用.