我有一个nodejs应用程序(http://app.winetracker.co),我正在集成OAuth登录。我想我可以使用global.redirectURL var临时存储重定向URL,以便在OAuth回调后使用。
// url param passed to route /auth/twitter?redirectUrl=/path/to/location
app.get('/auth/twitter', function(req, res) {
var redirectUrl = req.param('redirectUrl');
global.redirectUrl = req.param('redirectUrl');
passport.authenticate('twitter', {})(req, res);
});
app.route('/auth/twitter/callback').get(users.oauthCallback('twitter'));
如果我有2个用户同时通过OAuth登录我的应用,那么global.redirectURL值是否会被每个用户的重定向var值覆盖?
基本上,每个用户都是唯一的全局值,还是每个人共享相同的global.redirectUrl var值?
答案 0 :(得分:1)
如果我有2个用户同时通过OAuth登录我的应用,那么 每个用户的重定向都会覆盖global.redirectURL值 var值?
是的,它们会被覆盖,这样做是一个严重的问题。
基本上,每个用户都是唯一的全球价值观 共享相同的global.redirectUrl var值?
全局值与整个服务器共享,因此可能正在处理的所有用户的所有请求都可以看到存储的内容。您几乎不应该将这种临时信息存储在全局中。如果auth代码是异步的(我假设它是),那么您可以轻松地让多个请求与该全局冲突/冲突。这是一个需要做的错误。你必须改变另一种解决问题的方法。
此类问题的常见解决方案没有全局漏洞,包括以下内容:
使用会话管理器并将数据放入此特定浏览器的会话中,以便在重定向期间从那里检索它。
将信息作为查询参数放在重定向网址上,这样当浏览器返回重定向网址时,您就可以从查询字符串中解析出来了。
为此请求输入唯一ID,将其设置为Cookie并使用ID作为键将临时数据存储在地图中。然后,当重定向返回时,您可以使用cookie获取ID,然后在地图中查找值。这本质上是一个会话,但它的特殊目的仅仅是为了这个目的。为了彻底,您还必须确保您的地图随着时间的推移而泄漏并积累,因此您必须存储时间戳并通过删除旧值来定期清理地图。