使用Node.js和SPA进行SAML2.0身份validation
我已经为了解决这个看起来很简单的任务而头痛了大约2天,但是开始让我发疯。
我有一个应用程序,用户将使用SAML 2.0进行身份validation。 我为前端设置了一个反应应用程序,并且认为我将使用JWT来确保前端和后端之间的其余api通信。
当用户login时,stream程如下:
- 用户访问www.server.com/并通过反应应用程序获取静态HTML
- 用户点击“login”并访问www.server.com/login
- passport-saml将用户redirect到saml身份提供者。 用户login。
- 用户使用req.body中的SamlResponse调用www.server.com/callback,它由passport-saml解码并放入req.user。
- 如果用户不存在,我在数据库中创build用户。
- 我创build了一个智威汤逊
接下来我应该做什么? 问题是用户在从身份提供者callback时没有处于反应应用程序,所以我已经在应用程序中失去了所有的状态,所以我回复的任何东西都会被发送到浏览器。
有什么办法可以强制浏览器给我的身份提供者回拨的SamlResponse? 然后,我可以将它作为来自react-application的http请求发送到服务器。
经过一番思考,我想出了以下解决scheme,对我来说工作得非常好。
SAML有一个名为RelayState
东西,它是服务提供商必须回应的属性。 所以现在这个过程如下所示:
- 用户访问
http://frontendserver.com
并通过React应用程序(未login)获取服务器的静态页面。 - 用户点击“login”,并redirect到
http://backendserver.com/login/?RelayState=http://frontendserver.com
,通过passport-saml进行身份validation并将用户redirect到SP。 所以我在RelayState中传递请求的来源。 - 用户使用SamlResponse调用回http://backendserver.com/callback ,其中包括RelayState。
- 我创build一个令牌,并将用户redirect到
RelayState/#token
。 - 然后,我可以parsingReact应用程序中的URL,并将该标记添加为任何进一步请求的标头。
这似乎是明显的做法,但是我花了相当长的时间才弄清楚这样做会起作用。
- 抛出新的TypeError('超级构造函数到“inheritance”不能'+
- 当在app.getcallback中调用fs时,Express.JS服务器会给出“内部错误”消息
- 维护带有现场的Yeoman发电机
- NodeJS http-proxy:代理https时出现DEPTH_ZERO_SELF_SIGNED_CERT错误
- 使用node-postgres将文件存储在postgres中
- 茉莉花节点的目的是什么?
- 为Node-REDfunction块上的每个输出返回一条消息
- 如果package.json文件已经更新,用户应该运行什么NPM命令?
- debugging打破与bunyan.createLogger – 节点v5.8发射