Wal*_*ers 4 javascript session node.js passport.js
我在用 :
对于每个用户,我存储在MySQL数据库中(我没有关于此技术的选择)来自他的Google个人资料(电子邮件等等)的一些信息,访问和刷新令牌,以及用户提供的附加信息.他在我的应用程序上注册.
我已经看到了passport.js的不同用途,特别是关于如何在会话中存储该信息.
在passport.js的配置页面上,我真的不明白以下代码块的要点:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Run Code Online (Sandbox Code Playgroud)
基本上,每次用户发出请求或访问页面时,都会向DB请求并检索信息.有什么意义?它减慢了应用程序的速度.调用时不应检索数据库中的信息serializeUser(即信息存储在会话中时)?
我已经读过,存储太多信息session会降低应用程序的速度.什么是"太多"?应用程序会减慢多少钱?有人知道某处是否有测试?我的应用程序页面需要一组关于我的用户的不同数据(例如,主页只需要他的名字,而个人资料页面将需要所有内容,另一个页面需要知道他拥有的汽车等...).我应该在检查用户是否存在于DB 中session时存储所有信息passport.authenticate(从而将对DB的读取请求限制为大约一个),或者仅在会话中存储他的ID并让我的页面在必要时向DB发出附加请求?
我的另一个问题是:在注册过程中,我首先让用户登录他的Google帐户,我将他的个人资料的详细信息存储在某个地方,让他填写一份表格以获取其他信息,然后我将所有内容都插入到数据库中.问题是我不知道如何正确存储他的Google帐户详细信息,直到它们插入数据库.目前,我将它们存储在session,然后在插入成功时删除它.更具体地说,当我的数据库中没有找到现有用户时,我会在passport.authenticate回调中执行此操作:
return done(null,false,userInfo);
Run Code Online (Sandbox Code Playgroud)
因此,用户未经过身份验证,我有两个问题:我必须在userInfo某个地方存储,直到用户注册,我必须req.login()在注册完成后"手动" 登录.
我是否应该在登录Google帐户后立即对其进行身份验证?如果他没有完成注册,这不会给我带来安全问题吗?
非常感谢你 !
1)serializeUser过滤数据并将其存储在会话cookie中.如果可以,通常在cookie中存储较少.无论如何,您将调用数据库以获取有关用户的数据,因此您只需存储用于检索和重新构建用户的ID,如deserializeUser中所示.
来自cookie的请求由客户端提供给服务器,服务器将cookie反序列化为数据,解密cookie内容或从db检索用户数据.然后响应出来,服务器序列化客户端数据,刮掉你不会存储在cookie中的东西并将它们放入数据库中,只需在cookie中留下一个id.
如果你正在进行加密,那么当你想通过运行多台机器进行扩展时,这很容易被搞砸,每台机器都需要能够解密数据(不是很难,但是不必要的复杂性)
将未加密的数据放在cookie中并不是最好的,除了cookie中的任何内容之外,还可以为用户添加额外带宽使用量.
2)数据库调用应该非常快,如果不是,那么无论如何你都会在其他地方遇到痛苦的用户体验.换句话说,我强烈的观点是,对于远离cookie存在压倒性的争论.
考虑每次请求都会发送cookie; 它会更聪明,而不是将数据推入会话并增加开销,在用户发出请求后暂时(缓存)用户数据加载,然后既没有数据库调用也没有来自cookie的开销而用户主动在您的网站上.
老实说,一开始你应该没有缓存.专注于以最低的复杂性来提升您的应用程序.这样您就可以根据用户反馈更快地修改它并减少错误.
3)当我玩护照时,我遇到了类似的问题.我会让护照完成它的工作,并向用户授予护照级别的验证(所以是的,他们已经登录),然后单独进行更多的数据收集.如果您担心安全问题,请将此护照级别的验证未完全登录,并在升级到完全登录之前需要更多数据.
我可能与这个非常不合适,但这是我的建议.
4)当你有多个节点实例并希望将某些东西存储在内存中时(例如计数器或缓存的用户数据),Redis很适合.这样,您不会在节点代码中保留有关用户的缓存数据的变量,当用户返回并且负载均衡器将其射向另一个实例时,另一个节点实例无法利用该变量. http://www.ourdailycodes.com/2013/09/redis-when-should-i-use-it.html
编辑:我应该添加该会话使用cookie,但只给用户一个服务器理解的唯一令牌,以便服务器可以在收到连接并附带会话令牌时重新收集用户的会话数据.我的理解是,这是Session工作的一般正确方式......但它因实现而异(如果我在这里错了,有人会纠正我).
| 归档时间: |
|
| 查看次数: |
3096 次 |
| 最近记录: |