关于验证登录
发布于 6 年前 作者 linliny 4226 次浏览 来自 问答

我自己目前使用的验证方式是这样的: 客户登录的时候,登录验证通过,就把req.session中的一个属性设为true,比如req.session.authenticated=true 然后对于登录的判断,就是客户访问接口的时候,检查req.session.authenticated是否为true。 感觉这样不是很严谨,所以想问下这样做的弊端是什么,还有有什么更好点的方式来做验证。

12 回复

你们 session 的存储方式是啥? cookie ?那有没有加签或加密? 如果别人篡改了 cookie 咋办?

@atian25 好像什么都没做,只是在登录的路由,把req.session.authenticated改成了true,我简化下逻辑,登录和验证大概是这样的:

QQ截图20180201104045.png

看你自己的 koa session 插件咯,如果你啥都没干的话,默认可能就是 cookie 了。。 或者看下 devtool 的 cookie

这是用express写的,然后想问下这种方式的安全性如何,感觉有点不靠谱,还有有什么好的方案吗

安全性上面不是说了么,你既然是判断一个变量,那你就要分析这个变量能否被外部篡改。

session 如果存在 cookie,那就要看 cookie 的安全性,cookie 如果没有做加签或加密,那人家随便改改就完了。

cookie/session最常见的问题: 仅适用于web端发起的请求. cookie易被劫持, 容易被CSRF. session如果是在本机, 多节点就得考虑会话保持: 同一用户的请求分配到同一台服务器上.

使用token(一般指jwt) 安全, 无状态, 且很方便用于多端. 请看我的简单示例: https://github.com/xiaozhongliu/node-api-seed/blob/master/ctrl/base-ctrl.js

推荐jwt 无状态方便扩展

你用的是express-session还是cookie-session? 它们一个存在服务器一个存在cookie,但存在cookie的是加密的,安全倒是不需要太担心。

严谨性的话那就session存一个用户id,验证的时候去数据库里查查用户存不存在,这个我看见php laravel框架里的的auth中间件是这么做的,但是每次验证都要查数据库会不会有问题,这个我也想知道。可以吧近期登陆用户存redis缓存里,应该快些

我觉的也没有什么, 这样也可以, 就是简单了点, sesson 可以保存 mysql, MongoDB, redis 中. 具体使用哪一个要看自己的使用场景吧. 具体需不需要保存数据库还是要看实际的业务需求的.

可以使用Token的方式,每次登录触发生成一个新Token代替旧Token,登录之后每次前端往服务端发请求可以按需要求传Token

回到顶部