一、前后端身份认证
1.web开发者模式
(1)服务端渲染的Web开发模式
(2)前后端分离的web开发模式
选择:
2.身份认证
身份认证:又称身份验证、鉴权,是指通过一定的手段,完成对用户的身份确认。
不同开发模式下的身份认证:
3.Session认证机制
(1)HTTP协议的无状态性
HHTP协议的无状态性,指的是客户端的每次HTTP请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次HTTP请求的状态
(2)突破HTTP无状态的限制——Cookie
cookie:是存储在用户浏览器中的一段不超过4KB的字符串。它由一个名称(Name),一个值 (Value)和其他几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。
不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前 域名下所有未过期的Cookie一同发送到服务器
Cookie特性:①自动发送 ②域名独立 ③过期时限 ④4KB限制
(3)Cookie在身份认证中的作用
(4)Cookie不具有安全性
由于Cookie是存储在浏览器当中的,而且浏览器也提供了读写Cookie的API,因此Cookie很容易被伪造,不具有安全性。因此不建议服务器将重要的隐私数据,通过Cookie的形式发送给浏览器。
(5)Session的工作原理
4.在Express中使用Session认证
(1)安装express-session中间件
(2)配置express-session中间件
需要通过app.use()来注册session中间件
const session=require('express-session')
app.use(
session({
secret:'myself',//secrect属性的值可以为任意字符串
resave:false,//固定写法
saveUninitialized:true,//固定写法
})
)
(3)向session中存数据
当express-session中间件配置成功之后,即可通过热情。session来访问和使用session对象,从而存储用户的关键信息。
//登录API接口
app.post('/api/login',(req,res)=>{
//判断用户提交的登录信息是否正确
if(req.body.username!=='admin'||req.body.password!=='00000'){
return res.send({ status:1, msg:'登陆失败'})
}
//TODO_02:请将登陆成功后的用户信息,保存到session中
//只有成功配置了express-session这个中间件之后,才能通过req点出来session这个属性。
//这里user的位置就是我们自己定义的,想变成什么都可以
req.session.user=req.body // 用户信息存储到session中
req.session.islogin=true // 将用户的登陆状态,存储到session中
return res.send({ status:0, msg:'登陆成功'})
})
(4)从session中取数据
可以直接从req.session对象上获取之前存储的数据
//获取用户姓名的接口
app.get('/api/username',(req,res)=>{
//TODO_03:请从session中获取用户的名称,响应给客户端
//先判断用户是否登录
if(!req.session.islogin){
return res.send({status:1, msg:'fail'})
}
res.send({
status: 0,
msg:'success',
username:req.session.user.username,
})
})
(5)清空session
调用:req.session.destroy()函数,即可清空服务器保存的session信息。注意!注会清空当前session,不会影响其他session
//退出登录的接口
app.post('/api/logout',(req,res)=>{
//TODO_04:清空session信息
req.session.destory()
res.send({
status:0,
msg:'退出登录'
})
5.JWT认证机制
(1)了解session认证的局限性
(2)认识JWT(JSON Web Token)
是目前最流行的跨域认证解决方案
(3)JWT的组成部分
JWT通常由三部分组成:Header(头部),Payload(有效荷载),Si给nature(签名)
(4)JWT的使用方式
6.在Express中使用JWT
(1)安装JWT相关的包
(2)导入JWT相关的包
(3)定义serect密钥
(4)登陆成功后生成JWT字符串
调用jsonwebtoken包提供的sign() 方法,将用户信息加密成JWT字符串,响应给客户端
(5)将JWT字符串还原为JSON对象
(6)使用req.user获取用户信息
(7)捕获解析JWT失败后产生的错误