jwt认证机制(token作用及原理解析)

jwt认证机制实际上就是通过token密钥对于用户信息的认定

jwt工作原理(token运作流程)

jwt认证机制(token作用及原理解析)_第1张图片
从上图中可以看出,jwt的工作原理是:(以下号表示注释标号)
(1)客户端通过post请求(1
)将用户名密码提交给服务器,服务器验证通过之后,将用户的重要信息从信息对象中剔除并加密生成一个token字符串
(2)服务器响应客户端的post请求,并将生成的token字符串返回给客户端
(3)客户端将token存储在本地localStorage或sessionStorage中(2*)
(4)客户端再次发起请求时,通过Authorization字段,将token作为请求头发送给服务器
(5)服务器对token进行解析(3*),将其还原成用户的信息对象,并以此为依据,对用户在数据表中的数据组进行锁定,完成用户请求中的操作内容
(6)操作完成之后,服务器向客户端响应回相应的结果
1*)发送post请求的原因是:避免密码暴露在浏览器头部
2*)将token存在本地的原因是方便之后发送请求时进行头部验证,这得谈论到token诞生的原因:在用户登录进网站之后,需要针对于用户点击的区域或其它操作对用户的数据进行读取或者修改,如果每次发起请求时,都需要输入提交用户名密码,那显然是极其不合理的,所以就出现了token。作为一个类似令牌的密钥,它作为请求头来表明用户信息,避免了请求修改(获取)数据时,对于账户密码的重复需求。后面对其运作原理作解析。
3*)这个解析是否成立的原因不仅包括token值是否正确,还包括token值的有效时长。当token从生成开始,一直到其设置好的生效时间结束,jwt的token解析方法都能对其做出正确的解析,否则会解析失败。

**总结及笔者误区:**常听到头部验证这句话,我一直以为验证通过了就是相当于直接获取到了用户的所有信息,而实际上的验证是,服务器将加密的token进行解析,如果能够被正确解析,才算是验证通过,然后根据解析出来的id等唯一标识字段来匹配到用户的数据组,进而根据请求内容对数据组进行操作。即头部验证的一个作用是进行身份验证,看是否能够被解析,第二个作用则是匹配到用户相应的数据组

token运作代码

1.加密在客户端向服务器提交正确的用户名密码之后,服务器会通过如下方式将用户的非重要信息对象转换为一个json字符串

 //剔除重要信息
const user = { ...results[0], password:''} 
// 生成 Token 字符串
const tokenStr = jwt.sign(user, config.jwtSecretKey, { 
  expiresIn: '10h', //  //第一个参数为加密的信息,第二个参数为加密的密钥,第三个参数表示token有效期为 10 个小时
})

2.解析在客户端将token通过头部验证的方式提交到客户端之后,会被解析成加密前的样子(能否被解析也是验证的一环),并根据解析出来的数据来匹配到用户在数据表中的数据组

app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }))
//  使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证

该具备解析token密钥的中间件写在路由模块之前,目的是给予当前数据流转过程解析token密钥的功能,让下方路由请求模块中提交过来的token密钥能够被顺利解析
3.错误处理如果认证失败,需要提示用户

// 错误中间件
app.use(function (err, req, res, next) {
  // 省略其它代码...
  // 捕获身份认证失败的错误
  if (err.name === 'UnauthorizedError') return res.send({status:1,message:'用户认证失败'})
})

你可能感兴趣的:(http,node.js)