JWT认证机制
Session认证机制需要配合Cookie才能实现。由于Cookies默认不支持跨域访问,所以,当涉及到前段跨域请求后端接口的时候,需要很多额外的配置,才能实现跨域Session认证。
当前端请求后端接口不存在跨域问题的时候,推荐使用Session身份认证机制
当前端需要跨域请求后端接口的时候,不推荐使用Session身份认证机制,推荐使用JWT身份认证机制
组成部分
Header:头部
Payload:有效负荷
Signature:签名
三者之间使用’.'分割
Header和Signature
安全性的相关部分,保证Token的安全性,防止用户破解
Payload
真正的用户信息,加密后生成的字符串
使用方式
客户端收到服务器的JWT之后,通常会把它存储在localStorage或sessionStorage中
此后,客户端每次和服务器通信,都要带上这个JWT字符串,从而进行身份认证。推荐的做法是吧JWT放在HTTP请求头的Authorization字段中
格式如下
Authorization:Bearer <token>
安装JWT相关的包
npm i jsonwebtoken express-jwt
jsonwebtoken用来生成JWT字符串
express-jwt用来将JWT字符串解析还原成JSON对象
定义secret密钥
为了保证JWT字符串的安全性,防止JWT字符串在网络传输过程中被别人破解,我们需要定义一个用于加密和解密的secret密钥
1.当生成JWT字符串时,需要使用secret密钥对用户的信息进行加密,最终得到加密好的JWT字符串。
2.当把JWT字符串解析还原成JSON对象的时候,需要使用secret密钥进行解密
const secretKey='itheima No1'
登陆成功后生成JWT字符串
调用jsonwebtoken包提供的sign()方法,将用户的信息加密成JWT字符串,响应给客户端:
app.post('/api/login',function(req,res){
res.send({
status:200,
message:'登陆成功',
//调用jwt.sign()生成JWT字符串,三个参数:用户信息对象,加密密钥,配置对象
token:jwt.sign({username:userinfo.username},secretKey,{expiresIn:'30s'})
})
})
将JWT字符串还原成JSON对象
app.use(express({secret:secretKey}).unless({path:[/^\/api\/]}))
捕获解析JWT失败后产生的错误
当使用Token字符串时,如果Token过期或者不合法,会产生一个解析失败的错误,影响项目的正常运行,我们可以通过Express的错误中间件,捕获这个错误并进行相关的处理