express-session和passportjs各自都做了哪些事情实现了自动登录?

大白菜丶
  • 101

我在看Express in action这本书,第八章这本书用到了passport和express-session这两个库,实现了自动登录,但是没有具体解释这两个库都干了什么.
有人可以解释一下为什么能自动登录吗?具体的流程是怎么样的?

回复
阅读 4.6k
2 个回答
✓ 已被采纳

谢邀吧!

通过你的问题,我大概看出来你的问题不在于express本身(她就是个web框架-包含了一系列web开发需要的功能,可以直接拿来使用),而在于web开发。这事情无关乎是否自动登录,你其实是不知道httpsession在web开发中都扮演的是什么角色。

这个问题就有点大了,为了减少废话,我先给你几个小链接,强烈建议阅读:

http-short-edition
http-wiki

session-short-edition
session-wiki

首先说session,(又称:会话),这是个什么鬼?那得从源头讲起。。。(此处省略一万字),简单说就是因为http本身是一种无状态协议,在web发展的初期,web仅用来提供浏览服务(各种黄页啊、新闻网啊甚至是一些论文)。这类服务不需要状态,打开看了,看完关闭 - 完美,没毛病。

可是随着人们生活水平的提高,web也在发展,时至今日,web已经越来越趋向于应用化,具体表现为:有鉴权系统(内容不是你想看,想看就能看的),可交互(就像我们在sf上问答一样,内容可编辑)。。。。,如果这样还是每次请求的无状态,合适么?打个比方, 我刚登录完,然后随便点了个按钮请求个别的数据,结果因为请求都是无状态的,服务器根本不知道我登录过,又让我登录一遍,死循环呐!。。。

于是session就要出来救场了,我们需要这么一种机制可以记录用户的行为轨迹,这样,在用户打开网页的时候,为其建立session,并保存其临时信息,在他关闭网页之前,该临时信息会伴随他的每次请求,这样,服务器永远都知道用户现在什么进度,之前存过什么,改过什么了。。

上面的链接如果还没看,我找个短的,截个图来说明下:

图片描述

第二段讲到,其实把信息存在cookies里,或者每次发请求时加在url后面作为query parameters都是可行的办法。但这毕竟不好(存在客户端,用户可以自行篡改,听起来就很恐怖)

于是第三段又讲了,常见的方案是,信息还是存在服务器端,但是给这段信息指定一个唯一的id,让客户端在cookie/localStorage里只存这个id,每次请求只要在header里把这个id带去服务器,服务器根据id就能找到临时信息了,这样就解决了用户可以随意篡改临时信息的问题。

最后一段讲了,我们通常也不希望永远在服务器上保存这段临时信息(有人就登录了一次,以后再也没玩过你的网站,你还浪费资源一直在缓存里记着他的信息?),所以基本都会设置有效期。这里就是你的问题,假设我把有效期设置成1天,那么你登录完,关了浏览器,再打开访问该网站,因为cookie里的id还在,而id有效期还没过,服务器还能根据这个id取到你的登录信息,然后就给你显示已登录后的界面了,这不就是你要的自动登录么?(我这里只说最简单状况,不表示所有网站都是这么做的,有人拿支付宝啊什么的来说事,那不一样的哦,如果付钱的工具还总能自动登录,吓不吓人!?)

最后再简单谈下passport,这是一个专注于鉴权的中间件系统,有很多现成的插件可用,譬如:使用facebook账号登录啊什么。严格意义上说,他和自动登录没什么特别的关系,他仅仅是在登录时可以用来负责校验身份的一个工具

express-session原理是写个connect-id在client的cookie里,这个id其实就是session了,以后每次请求都会带在request的head里,这样你就可以根据session状态来判断用户是否登录过了。

另外个passport没用过

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏