实现登陆原理其实很简单,之前有用模块来做,但是对一些细节不明就理,这次无聊就翻了一下 koa-generic-session 和 koa-sess-mongo-store 源码,感觉明朗了很多.
以下是一点笔记.
使用就几行代码。
1 | var session = require('koa-generic-session'); |
原理很简单,要使用session实现登陆,要把session信息放在服务端.在进入路由的时候使用中间件来验证。
sessionId存在客户端cookie里面。查看cookie会发现这么一段: yuk-admin.sid=jNoQfiL0vK8kJYo7cmFoFuxygQnmIxhr;
具体这个值的产生过程:
来看一下session中间件:
1 | function *session(next) { |
getSession的具体内容就是从从cookie读取sessionID,根据sessionID去数据库里把整个session查出来,要是找不到就会生成一个新的会话。
在这里,找不到这个会话有两种情况:
- 新用户,直接新建,并把sessionId存在cookie
- 老用户,cookie有sid,用这个id去数据库把session查出来用
- 老用户,cookie有sid,但是因为cookie设置了过期时间,把sid删除了,那这个会话丢失,等到ttl设置的时间自动删除, 新建session
自动删除的原理是 koa-sess-mongo-store 源码里的这一句
1 | self.col.ensureIndex({ttl: 1}, {expireAfterSeconds: 0}, done); |
之后会用新的值来刷新数据库refreshSession。