1.安装jsonwebtoken和express-jwt
npm i jsonwebtoken express-jwt
2.实例
// 安装:npm i jsonwebtoken express-jwt// 1.导入express
const express = require('express')
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')// 2.创建web服务器
const server = express()// 3.监听服务器的启动
server.listen(8889, () => {console.log("web服务器启动了 http://127.0.0.1:8889");
})// 4.解析post传参
// 4.1post请求通过body传参并为raw类型中json格式传参时,通过express.json()这个中间件,解析表单中的JSON格式的数据,不解析就拿不到req.body
server.use(express.json()) // 解析JSON格式数据
// 4.2post请求通过body传参并为x-www-form-urlcoded类型传参时,通过express.urlencoded()这个中间件,解析表单中的 url-encoded 格式的数据,不解析就拿不到req.body
server.use(express.urlencoded({ extended: false })) // 解析url-encoded 格式的数据// 5.定义secret秘钥,可以随意定义
const secretKey = 'kanno&fangbaobao'// 6.注册将JWT字符串解析还原成JSON对象的中间件,并且路由有/api的接口就不需要token,例如下面的登录接口
server.use(expressJWT({secret: secretKey}).unless({path:[/^\/api\//]}))// 7.登录接口
server.post('/api/login', (req, res) => {const userInfo = req.body;if (req.body.username !== 'admin' || req.body.password !== '123456') {return res.send({ code: 200, status: 0, msg: '登录失败,请检查账号密码正确!' })}// 登录成功后,调用jwt.sign()方法生成JWT字符串。并通过token属性发送到客户端// 参数1:用户的信息对象// 参数2:加密的秘钥// 参数3:配资对象,可以配置当前token的有效期res.send({code: 200, status: 1, msg: '登录成功!',token:jwt.sign({username:userInfo.username},secretKey,{expiresIn:'30s'})})
})// 8.获取token-获取用户信息
server.get('/user', (req, res) => {console.log("req222",req.user);res.send({code: 200,status: 1,msg: "success",data: {username:req.user.username}})
})// 9.注册错误中间件
server.use((err,req,res,next)=>{if(err.name==='UnauthorizedError'){return res.send({code:401,msg:"无效的token"})}res.send({code:500,msg:'未知的错误'})
})