服务器端渲染
使用 session
因为 http 协议是无状态的,这是使用 session 的前提。
就像进出学校的时候,如果保安就看一下你的校园卡,都不看你是不是校园卡上的样子,那么这时候校园卡就是 cookie
登录成功之后,服务器端会给浏览器颁发 cookie 。
cookie = Name + Value + (有效期、安全性、使用范围)
cookie 的特性:
- 自动发送
- 域名独立
- 过期时限
- 4 KB限制
使用 cookie 完成身份验证的过程:
(cookie 是自动发送的 -> 程序员不需进行操作)
关于 cookie 的安全性:
cookie 不具有安全性
谁捡到你的校园卡都可以使用
浏览器端的 cookie 不能存储用户的重要数据。
提高用户身份认证的安全性
校园卡 + 刷卡认证
如果保安认真看了你是不是卡上的人,甚至然你刷卡验证,这时候就是 cookie 和 session 相结合了
session 的工作原理:
express-session 中间件的使用
// 导入session 中间件
let session = require(' express-session');
// 配置 session 中间件
app.use(sesison({
secret:'niubi', // 配置任意字符串,负责对 session 进行加密
resave:false,
svaUninitialized:true
}))
向 session 中存数据:
通过 req.session 来操作 session。
req.session.user = req.body;
req.session.islogin = true;
从 session 中取数据:
app.get('/api/username',(req,res)=>{
// 判断用户是否登录
if(!req.session.islogin){
return res.send({status:1,msg:'fail'})
}
res.send({status:0,msg:'success',username:req.session.user.username})
})
清空 session:
// 退出登录的接口
app.post('/api/logout',(req,res)=>{
// 清空 session 的信息
req.session.destory();
res.send({status:0,msg:'退出登录成功!'})
})
前后端分离
使用 jwt
session 的局限性:
session 认证机制需要配合 cookie 才能够使用,由于 cookie 默认不支持跨域访问,所以需要做很多额外的配置,才能够使用跨域 session 认证。
注意:
使用session还是jwt主要取决于是否跨域。
jwt -> JSON web token
jwt 的工作原理:
加密 + 还原
jwt 的字符串 = header(头部) + payload(有效载荷) + signature(签名)
格式:
header.payload.signature
payload 部分是真正有用的用户信息,其余两部分与安全性有关。
jwt 存储在请求头的 Authorization: Bearer
在 express 中使用 jwt
两个包:
jsonwebtoken -> 生成 jwt字符串
express-jwt-> 将 jwt 字符串还原为 JSON 对象
const jsonwebtoken = require('jsonwebtoken');
const expressJWT = require('express-jwt');
我们需要定义 jwt 的加密密钥
- 加密
- 还原
const secretKey = 'ljj^_^'
具体的使用:
// jwt 生成
// 登录接口
// 用户登录成功后,生成 jwt 字符串,通过 token 响应给客户端
app.use('/api/login',function (req,res) {
//登录失败的代码
...
//登录成功
res.send({
status:200,
msg:'success',
// sign的单个参数:用户信息,密钥,配置对象(有效期)
token:jsonwebtoken.sign({username:userInfo.username},secretKey,{expiresIn:'30s'})
})
})
// jwt 还原
// 使用 unless({path:[/^\/api\//]}) 来指定哪些页面不需要访问权限
app.use(expressJWT{secret:secretKey}.unless({path:[/^\/api\//]}))
// 成功后,req.user即可使用
express 的错误中间件:
app.use(errr,req,res,next) => {
// token 导致的错误
if(err.name === 'UnauthorizedError'){
return res.send({...})
}
// 其他原因导致的错误
res.send({...})
}