身份验证
HTTP 是一种没有状态的协议,也就是它并不知道是谁访问。客户端用户名密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证
session
思想
- 客户端用户名跟密码请求登录
- 服务端收到请求,去库验证用户名与密码
- 验证成功后,服务端种一个cookie或发一个字符到客户端,同时服务器保留一份session
- 客户端收到 响应 以后可以把收到的字符存到cookie
- 客户端每次向服务端请求资源的cookie会自动携带
- 服务端收到请求,然后去验证cookie和session,如果验证成功,就向客户端返回请求的库数据
Session存储位置: 服务器内存,磁盘,或者数据库里
Session存储内容: id,存储时间,用户名等说明一下登录的用户是谁
客户端携带 : cookie自动带,localStorage手动带
如何保存信息给浏览器
前端种:
cookie/localstorage
后端种:
服务器给浏览器种cookie: cookie-parser
服务器给浏览器种cookie的同时在服务器上生成seesion: cookie-session
cookie-session
安装引入
let cookieSession = require('cookie-session')
配置中间件
app.use(cookieSession({
name:'保存到服务器的session的名字',
keys:[必传参数,代表加密层级],
maxAge:1000 //保留cookie的时间
}))
种cookie,备份session
req.session.key=value
读cookie对比session
req.session.key 返回true
删除cokkie、session
delete req.session.key
req.session.key = undefined
token
思想
在服务端不需要存储用户的登录记录,全部发给客户端有客户端自己存(cookie,local)
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
实现
jsonwebtoken的安装引入
let jwt = require('jsonwebtoken')
生成签名
let token = jwt.sign(payload, secretOrPrivateKey, [options, callback])
[^ payload ]:json 还有username,userid
[^ secretOrPrivateKey]: 加密规则,字符串,或者私钥path模块
[^ options]: 可选配置项
[^ callback]: 成功回调, 可选 返回制作后的token,也可同步返回
校验token
jwt.verify(token, secretOrPublicKey, [options, callback])
token删除
又客户端,负责删除