在Node.js(express 框架)中使用 JWT 进行身份认证

一、JWT 认证机制

JWT 认证机制(图片来源于网络,侵权删除):

JWT 认证机制

关于 JWT 原理可参考:https://ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

二、安装 JWT 相关的包

yarn add jsonwebtoken express-jwt

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

三、基本使用

用户登录前:用户输入用户名密码进行登录 --> 用户名密码正确 --> 生成 JWT 字符串并携带用户信息发送至客户端

用户登录前

用户登录成功后 --> 客户端每次发送请求经过中间件将 JWT 解析还原成 JSON 字符串 --> JWT 解析成功 --> 处理相关逻辑

 用户登录后

1、生成 JWT 字符串

routes/users.js 文件中实现用户登录功能

var express = require('express');
var router = express.Router();
// 此处省略 mongodb 数据库连接相关操作
const mongoDB = require('../db/conMongoDB');

// 用于生成 JWT 字符串的包
const jwt = require('jsonwebtoken');
// 定义 secret 密钥(自定义)
const secretKey = 'abcd';
// token 过期时间(自定义)
const expiresIn = '86400s';

登录功能实现:

router.post('/login', async function (req, res, next) {
    const usersTable = mongoDB.collection('users');
    // 判断用户名密码是否存在
    const findResult = await usersTable.findOne(req.body);
    if (findResult) {
        res.send({ success: true, code: 0, msg: "登录成功", username: findResult.username, 
            // 生成 JWT 字符串,三个参数:用户信息对象、加密密钥、配置对象
            token: jwt.sign({ email: req.body.email }, secretKey, { expiresIn: expiresIn })
        });
    } else {
        res.send({ success: false, code: 1, msg: "登录失败", data: "" });
    }
})
2、添加中间件,解析 JWT 字符串

该项目是使用 express-generator 生成的 express 基本结构,所以有 app.js 文件,根据自身情况在合适的位置添加解析中间件。

app.js 文件内容如下:

var express = require('express');
...
// 用于将客户端发送过来的 JWT 字符串,解析还原成 JSON 对象的包
const expressJWT = require('express-jwt');
const secretKey = 'abcd';  // secret 密钥

var usersRouter = require('./routes/users'); // 普通用户
var adminRouter = require('./routes/admin'); // 管理员

var app = express();
...
// 用来解析 Token 的中间件(此处使用 unless 排除以 /api 开头的请求)
app.use(expressJWT.expressjwt({secret: jwt_config.secretKey,algorithms: ['HS256']}).unless({path: [/^\/api\//]}));
// 异常处理
app.use((err,req,res,next) => {
    console.log(err);
})

app.use('/api/users', usersRouter);
app.use('/admin', adminRouter);

module.exports = app;
3、获取管理员信息(admin)

routes/admin.js 文件中实现管理员相关功能:

var express = require('express');
var router = express.Router();

router.get('/getInfo', async function (req, res, next) {
    console.log(req.auth);
    res.send('hello admin');
})

module.exports = router;

前端 vue3 发送请求:

// admin 相关 API 
export const getAdminInfo = () => {
    return axios({
        url: baseUrl + '/admin/getInfo',
        method: 'get',
        headers: {
            // userToken:用户登录成功后接收的 token 参数
            Authorization: `Bearer ${userToken}`,
        }
    })
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-10 17:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-10 17:08:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-10 17:08:01       82 阅读
  4. Python语言-面向对象

    2024-05-10 17:08:01       91 阅读

热门阅读

  1. 深入浅出微前端架构

    2024-05-10 17:08:01       31 阅读
  2. LXC,SRIOV,虚拟化

    2024-05-10 17:08:01       26 阅读
  3. 敏捷开发实践集(AgileDo):如何做好Scrum Master

    2024-05-10 17:08:01       36 阅读
  4. 如何更好地导入Scrum?

    2024-05-10 17:08:01       37 阅读
  5. 监管微信聊天记录-微信api开发接口-videosapi

    2024-05-10 17:08:01       29 阅读
  6. UDP广播

    UDP广播

    2024-05-10 17:08:01      39 阅读
  7. 力扣 673. 最长递增子序列的个数 python AC

    2024-05-10 17:08:01       34 阅读
  8. 深入理解Spring中的@Autowired注解

    2024-05-10 17:08:01       25 阅读
  9. Android Blueprint简介

    2024-05-10 17:08:01       33 阅读
  10. Nanopc T4 使用OpenCV

    2024-05-10 17:08:01       38 阅读