JWT认证机制

320 阅读3分钟

1.了解session认证的局限性

session认证机制需要配合cookie才能实现,由于cookie默认不支持跨域访问。所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域session认证。

注意:

  • 当前端请求后端接口不存在跨域问题的时候,推荐使用session认证机制
  • 当前端需要跨域请求后段接口的时候,不推荐使用 Session身份认证机制,推荐使用JWT认证机制

2.什么是JWT

JWT(英文全称:JSON Web Token) 是目前最流行的跨域认证解决方案

3.JWT的三个部分各自代表的含义:

jwt第三个组成部分,从前到后分别是:Header Payload Signature

其中

  • payload部分 才是真正的用户信息,它是用户信息经过加密之后生成的字符串

  • header 和 signature 是安全性相关的部分,只是为了保证Token的安全性

4.JWT的使用方式

客户端收到服务器返回的JWT之后,通常会将它存储在localStorage或sessionStorage中 此后,客户端每次与服务器通信,都要带上这个JWT的字符串,从而进行身份认真,推荐的做法是把**JWT放在HTTP请求头的Authorization字段中:*

Authorization:earer <token>

5.安装JWT相关的包

npm install jsonwebtoken express-jwt

其中:

  • jsonwebtoken用于生成JWT字符串
  • express-jwt用于将JWT字符串解析还原成JSON对象

6.导入JWT相关的包

使用require()函数,分别导入JWT相关的两个包

//导入用于生成JWT字符串的包
const jwt=require('jsonwebtoken');
// 导入用于将客户端发送过来的JWT字符串,解析还原成JSON对此昂的包
const expressJWT=require('express-jwt')

7.定义 secret密钥

为了保证JWT字符串的安全性,防止JWT字符串在网络传输过程中被人破解,我们需要专门定义一个加密和解密的secret密钥:

  • 当生成JWT字符串的时候,需要使用secret密钥对用户的信息进行加密,最终得到加密的JWT字符串
  • 当把jwt字符串解析还原成json对象的时候,需要使用secret密钥进行解密
//secret密钥的本质:就是一个字符串
const secretKey="it study ^_^"

8.将JWT字符串还原为JSON对象

客户端每次访问那些有权限接口的时候,都需要主动通过请求头的Authorization字段,将Token字符串发送到服务器进行身份认证 此时:服务器可以通过express-jwt这个中间件,自动将客户端发送过来的Token解析还原成JSON对象

//使用app.use()来注册中间件
//expressJWT({secret:secretKey})就是用来解析Token的中间件
//.unless({path:[/^\/api\//]}) 用来访问那些接口不需要访问权限
app.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}))

9.使用req.user获取用户信息

当express-jwt这个中间件配置成功后,即可在那些有权限的接口中,使用req.user对象,来访问从JWT字符串中解析出来的用户信息了

//这是一个由权限的API接口
app.get('/admin/getinfo',function(req,res){
    console.log(req.user);
    res.send({
        status:200,
        message:'获取用户信息成功',
        data:req.user
    })
})