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属性上