首先在终端执行npm init -y 命令进行初始化

然后执行npm install express 命令安装express相关的包

执行npm install jsonwebtoken express-jwt 命令安装jwt相关包

导入JWT相关的包

定义secret密钥

在登录成功后生成JWT字符串(这里的token有效期最好设置时间长一点,因为时间太短会导致后面操作数据无法显示)

将JWT字符串还原为JSON对象

使用req.auth获取用户信息(这里不要使用req.user来获取因为新版的express-jwt废弃了req.user,改用req.auth存储解析后的Token内容

捕获解析JWT失败后产生的错误

以下是完整代码:

const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({extended:false}));
//导入用于生成JWT字符串的包
const jwt = require('jsonwebtoken');
//导入用于将客户端发送过来的JWT字符串,解析还原成JSON对象的包
const { expressjwt: expressJWT } = require('express-jwt');
//secret密钥的本质:就是一个字符串
const secretKey = 'itheima No1 ^_^';
//登录接口
app.post('/api/login',function(req,res){
    if(req.body.username !== 'admin'|| req.body.password !== '000000'){
        return res.send({status:1, msg:'登录失败'});
    }
    //用户登录成功之后,生成JWT字符串,通过token属性响应给客户端
    res.send({
        status:200,
        msg:'登录成功',
        token:jwt.sign({
            username:req.body.username
        },secretKey,{
            expiresIn:'1h' //token的有效期为1h
        })
    })
})
//使用app.use()来注册中间件
//expressJWT({secret:secretKey})就是用来解析Token的中间件
//.unless({path:[/^\/api\//]})用来指定哪些接口不需要访问权限
app.use(expressJWT({secret:secretKey,algorithms:['HS256']}).unless({path:[/^\/api\//]}));
//这是一个有权限的API接口
app.get('/admin/getinfo',function(req,res){
    console.log(req.auth);
    res.send({
        status:200,
        message:'获取用户信息成功',
        data:req.auth
    })
})
//错误
app.use((err,req,res,next)=>{
    //token解析失败导致的错误
    if(err.name === 'UnauthorizedError'){
        return res.send({status:401,message:'无效的token'})
    }
    //其他错误
    res.send({status:500,message:'未知错误'})
})
app.listen(3000,()=>{
    console.log('3000端口服务已开启');
    
})

使用apifox进行测试,首先要在终端执行node node27.js命令

然后在apifox中先执行post来获取token

然后执行GET来获取信息(这里要传入token在Header中)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐