凡事总须研究,才会明白。古来常做登录,我也还记得,可是不甚清楚。我横竖睡不着,仔细看了半夜。
begin start login , 先聊下cookie和session
cookie 有个 **http only **告知浏览器,Cookies 的内容不允许被客户端的脚本访问,只用于http,看下图
Cookie和Session 的关系
就如大众所知,HTTP 协议是无状态的 。要想分辨每次http请求是哪个用户,需要使用Cookie和Session Session 的中文翻译为:「会话」
Set-Cookie
服务器管理状态使用到的字段,用于响应首部一则响应首部的 Set-Cookie 字段:(看第一张图。)
set-Cookie: status=enable;expires= Tue, 05 Jul 2018 07:26:31 GMT;path=/;domain=.xxxx;HttpOnly
普通的登录
普通的登录,要的就是一个登录页面,输入账号密码,提交Form表单,后端查询数据库对应用户名的密码,匹配正确则把用户记录到Session,不正确则返回错误。
但可能他没有教你的是,密码需要hash加密 。下图的网站没加
密码Hash密码hash,就是存进数据库的密码是一串密文,密文是明文密码通过不可逆算法得出的。在Nodejs中,你可以使用bcryptjs,它提供了hash
以及对应的compare
方法,非常适合用于密码的加密和对比。
有bcrypt项目使用地址
https://github.com/976500133/codebeauty/blob/d4228005bac6ba85e034e5281bf216a2a008db8e/lib/schemas/user.js
单点登录的2种方式
单点登录说白了就是在站点A的登录了,那么用户就自动在站点B、站点C、站点E登录了。这里说的是2个跨域的域名,基础域名不需要单点登录技术,直接通过path , domain 可以解决
1.JSONP的实现方式
用户在父应用中登录后,Cookie会存到客户端中,当用户需要登录子应用的时候,授权应用访问父应用提供的JSONP接口,并在请求中带上父应用域名下的Cookie。
这种做法是cookie 的安全性问题。安全问题放在了前端
2.302 重定向的方式
父应用提供一个GET方式的登录接口,用户通过子应用302重定向连接的方式访问这个接口,如果用户还没有登录,则返回一个的登录页面,用户输入账号密码进行登录。如果用户已经登录了,则告知子应用登录当前用户的状态。并返回相应信息
普通的cookie 识别,只适合不跨域的情况!
最简单的是使用cookie作为媒介,存放用户凭证。用户登录父应用之后,应用返回一个cookie,当用户访问子应用的时候,携带上这个cookie,校验通过则登录当前用户。