Node.js Express 中 JWT Token 的生成与校验实现

作者:夜航船时间:2026-10-31 09:19:56浏览:165

本文详解在 Node.js 和 Express 环境中使用 JWT 进行身份验证的完整流程。涵盖 JWT 结构解析、HMACSHA256 签名原理、Token 生成步骤,以及通过 jsonwebtoken 库实现 Token 的创建与校验,确保接口安全。

JWT

JWT 是一种轻量级的数据交换格式。与传统的 Session 机制不同,JWT 无需在服务器端存储会话状态,而是将所需信息直接封装在令牌内部。

生成验证流程

JWT

用户完成账号注册或登录后,服务端利用 HMACSHA256 算法,结合密钥(secret)以及对 header 和 payload 进行 base64Url 编码后的结果,计算出签名(signature)。随后,将编码后的 header、payload 与 signature 以“.”分隔连接,形成形如 xxxx.yyyy.zzzz 的 Token。此后,用户在每次请求资源时,需将该访问令牌置于请求头中。服务端验证令牌有效性后,返回相应的资源信息。

header(标头)

Token 的头部信息通常包含两部分:令牌类型(typ)以及所使用的签名算法(alg)。

{
    "alg":"HS256",
    "typ":"JWT"
}

payload(有效负载)

Payload 通常包含非敏感信息,例如用户的唯一标识符(id)、签发时间(iat)以及过期时间(exp)。

{
  "id": "655c78ccd9107661e41abd9f",
  "iat": 1702260106,
  "exp": 1710036106
}

signature(签名)

HMAC-SHA256(Hash Message Authentication Code-Secure Hash Algorithm 256 bit)是一种加密算法,它是 SHA-256 散列函数与密钥结合的身份验证方法。HMAC 的安全性依赖于散列函数(SHA-256),并通过添加密钥来增强信任度。该算法常用于 HTTPS、SSL、SSH 等加密通信领域。

生成 signature:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload), secret
)

访问令牌(token)

Token 的构成公式为:base64UrlEncode(header) + '.' + base64UrlEncode(payload) + '.' + signature。

举例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY1NWM3OGNjZDkxMDc2NjFlNDFhYmQ5ZiIsImlhdCI6MTcwMjI2MDEwNiwiZXhwIjoxNzEwMDM2MTA2fQ.ca-J91WaThntP3IhMBQNps9MVqts8oi_f62KcV2r4D8

express jwt生成、验证

1、安装 jsonwebtoken 依赖,执行命令:npm install jsonwebtoken --save

2、在代码的 controller 层引入该依赖,并在登录或注册逻辑中生成 Token。

//环境变量,通过安装dotenv依赖,在express入口文件中加载,
这么做的目的是不让密钥等敏感信息硬编码在代码中


JWT_SECRET=this-is-my-secret-password
JWT_EXPIRES_IN=90d

生成jwt

// authController.js 用户的登录、注册、密码修改、token生成、权限校验、凭证认证等
const jwt = require('jsonwebtoken');

const signToken = id => {
  return jwt.sign({ id }, process.env.JWT_SECRET, {
    expiresIn: process.env.JWT_EXPIRES_IN
  });
};

验证jwt

promisify(jwt.verify)(token, process.env.JWT_SECRET);

const { promisify } = require('util'); 

// protect中间件, 用于验证用户
exports.protect = catchAsync(async (req, res, next) => {
  let token;
  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith('Bearer')
  ) {
    token = req.headers.authorization.split(' ')[1];
  }

  if (!token) {
    return next(
      new AppError('您还还没有登录或注册', 401)
    );
  }

  // 2) 验证 token
  const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);
  
  // 验证jwt是否有效,decode信息是payload,其中包含用户生成jwt的id、iat、exp
  // 通过这个唯一id可以查询用户信息,如果promisify是rejected则进行错误处理逻辑
});

到此这篇关于node.js express JWT token生成与校验的实现的文章就介绍到这了,更多相关express JWT token生成与校验内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章
相关文章
更多