jwt 认证机制

jst 通常有三个部分组成,分别是header(头部)、payload(有效载荷)、signatrue(签名)

三者之间用逗号隔开:

Header.Payload.Signatrue
  • payload 才是真正的用户信息部分,他是加密后的字符串
  • header、signatrue 是安全性相关部分

安装:

npm install jsonwebtoken express-jwt

  • jsonwebtoken 用于生成 jwt 字符串
  •  express-jwt 用于将jwt字符串解析还原成 json对象
// 导入用于生成的 jwt 字符串的包
const jwt = require('jsonwebtoken')
// 导入用于将客户端 发送过来的 jwt 字符串,解析还原成 json 对象 的包
//const expressJWT = require('express-jwt')
const { expressjwt } = require("express-jwt") //@7版本

定义secret密钥

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

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

在登陆成功后 生成 jwt 字符串

调用 jsonwebtoken 包提供的 sign()方法,将用户的信息加密成 jwt 字符串,响应给客户端。

app.get('/login',(req,res)=>{
  //调用 jwt ,sign(),生成 jwt 字符串,三个参数分别是:用户信息对象,加密密钥,配置对象
  res.send({
    status:200,
    msg:'成功',
    data:req.query,
    token:jwt.sign({
      username:'Bearer ' + req.body.username
    },secretKey,{
      expiresIn:'30s'
    })
  })
}),

将 jwt 字符串 还原成 json 对象 

客户端在每次访问那些有权限接口的时候,都需要主动向请求头中的  Authorizaction,将Token字符串发送到服务器进行身份认证。

此时,服务器可以通过 express-jwt这个中间键,自动将客户端发送过来的 Token解析还原成 json 对象

// 使用 app.use() 来注册中间件  express-jwt @7
// expressJWT({secret:secretKey}) 就是用来解析 Token的中间件
//  用来指定那些借口不需要访问权限
app.use(
  jwt({
    secret: "shhhhhhared-secret",
    algorithms: ["HS256"],
  }).unless({ path: ["/token"] })
);

注意: 只要配置成功了 express-jwt ,就可以把解析出来的用户信息挂在到 req.user属性上 

猜你喜欢

转载自blog.csdn.net/Cat_LIKE_Mouse/article/details/124916148