(1):http是无状态协议。所以,在进行信息认证时,我们需要引入状态机制,也就是session机制。
(2):cookie,与域名有关,域名不变,cookie不变。也就是说,在同一域名下,请求各种资源都会携带cookie回后端。
下面来谈谈两种认证方式:
1.session(会话)
这种方式依赖于cookie,我们也称它为setCookie(种cookie)。
原理:当前端发出一次请求时,后端产生一个session ID,后端自动通过response返还给前端,也就是setCookie,用户请求第二个页面时,浏览器自动通过request携带cookie到后端进行比较。
以下步骤为操作过程:
-
安装express-session(yarn add express-session)
-
配置session,一定要在路由之前配置。
// session 配置,配置在路由之前 app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: false, cookie: { httpOnly: true, secure: false, maxAge: 24 * 60 * 60 * 1000 } }))
-
引入express-session后就直接有了session对象
扩展:
由此引出一个新的问题:登录不过期时,用户关闭浏览器再次打开,首页面依然保持登录状态。如何判断用户是否登陆过?以下提供两种解决方案:
第一种:通过判断cookie(sessionID)是否存在。缺点:sessionID不携带用户信息。
第二种:再次请求后端API,判断req.session.username是否存在,返回给前端一个信息。
2. 生成token(基于jwt(jsonwebtoken)的认证机制)
(1)生成token
方法一:对称加密:SH256
方法二:非对称加密:RS256,私钥加密,公钥解密。(github的传输就是采用非对称加密)
(2)后端向前端传输数据的方式有四种:
-
get(在queryString中显示)
-
post(FormData中显示)
-
通过自定义路由载荷一个对象
-
设置响应头res.header
要注意最后一种传输方式,前端接收时,如果采用jquery中ajax的success:(data,status,xhr)=>{}中的方法来获取response的头部信息会有坑,最好使用.then()方法。
(3)传递到前端,利用localstorage.setItem()存储token。token并不存储在服务器端,所以删除的时候要记得,从哪里存储,就在哪里删除。
(4)用户发起请求时,前端要想后端传递token,可使用jquery中$.ajax中的header配置。后端用req.header()取出token,进行验证,利用cert(签名)进行解密。