1.14 express小项目 和 用到的 jwt详解

我们做go最后项目 这次 改为 nodejs 重写后端

原文章:2.4.4goweb项目完结-CSDN博客文章浏览阅读647次,点赞15次,收藏7次。用户登录认证- 图书信息管理(浏览、新增)- HTML5 :使用语义化标签构建页面结构-https://chxii.blog.csdn.net/article/details/147311462?spm=1011.2415.3001.5331

nodejs重写 项目地址: 

 https://gitcode.com/chxii/NodeJS_01

json web token 介绍

JWT 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。

一、核心概念

1. JWT 的结构

JWT 由三部分组成,用点(.)分隔:

header.payload.signature
  • Header(头部)
    包含令牌类型(通常是 JWT)和使用的签名算法(如 HS256RS256)。

  • Payload(负载)
    包含声明(Claims),即关于实体(通常是用户)和其他数据的声明。

    • 注册声明:如 iss(发行人)、sub(主题)、exp(过期时间)等。
    • 公开声明:由各方自由定义。
    • 私有声明:在同意使用的各方之间定义。
  • Signature(签名)
    用于验证消息未被篡改,并且在使用私钥签名的情况下,还可以验证 JWT 的发送者身份。

二、工作流程

  1. 用户登录
    用户提供凭据(如用户名和密码)。

  2. 服务器验证
    服务器验证凭据,如果有效则创建 JWT。

  3. 返回令牌
    服务器将 JWT 返回给客户端。

  4. 客户端存储
    客户端(通常是浏览器)存储 JWT(如 localStorage、cookie 或内存)。

  5. 后续请求
    客户端在每个请求中包含 JWT(通常在 Authorization 头中,格式为 Bearer )。

  6. 服务器验证
    服务器验证 JWT 的签名和有效性,然后处理请求。

三、JWT 示例

1. 生成 JWT

安装 jsonwebtoken 包:

npm install jsonwebtoken
const jwt = require('jsonwebtoken');

// 密钥(实际应用中应保存在环境变量中)
const secretKey = 'your-secret-key';

// 载荷数据
const payload = {
  userId: 123,
  username: 'john_doe',
  role: 'admin'
};


const options = {
  expiresIn: '1h' // 过期时间,也可以写成数字如 3600(单位是秒)
};

const token = jwt.sign(payload, secretKey, options);

console.log('Generated Token:', token);

2. JWT 解析 (如果你只想解析 token 的内容而不验证签名(比如查看 header 或 payload))

原生base64解码

// 典型的 JWT 示例
const jwtToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywidXNlcm5hbWUiOiJqb2huX2RvZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTYxMjM0NTY3OCwiZXhwIjoxNjEyMzQ5Mjc4fQ.abcdef1234567890';

// 解析头部
const [encodedHeader, encodedPayload, signature] = jwtToken.split('.');
const header = JSON.parse(Buffer.from(encodedHeader, 'base64').toString());
const payload = JSON.parse(Buffer.from(encodedPayload, 'base64').toString());

console.log('Header:', header);
console.log('Payload:', payload);
console.log('Signature:', signature);


使用jwt库jsonwebtoken:

const parts = jwt.decode(token, { complete: true });
console.log('Header:', parts.header);
console.log('Payload:', parts.payload);

3. 验证 JWT
const jwt = require('jsonwebtoken');
const secretKey = 'your-secret-key';

// 客户端发送的令牌
const token = '...';

// 验证令牌
jwt.verify(token, secretKey, (err, decoded) => {
  if (err) {
    console.error('无效的令牌:', err.message);
    return;
  }
  
  console.log('解码后的载荷:', decoded);
});
2. 常见验证错误
  • TokenExpiredError:令牌已过期。
  • JsonWebTokenError:无效的签名、格式错误等。
  • NotBeforeError:令牌尚未生效(nbf 声明)。

四、与 Express 集成

1. 中间件验证
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

// 密钥
const secretKey = 'your-secret-key';

// 验证中间件
const authenticateToken = (req, res, next) => {
  // 从头部获取令牌
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  
  if (!token) {
    return res.status(401).send('未提供令牌');
  }
  
  // 验证令牌
  jwt.verify(token, secretKey, (err, user) => {
    if (err) {
      return res.status(403).send('无效的令牌');
    }
    
    // 将用户信息添加到请求对象
    req.user = user;
    next();
  });
};

// 受保护的路由
app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: '受保护的资源', user: req.user });
});

app.listen(3000);

六、刷新令牌(Refresh Token)实现示例


// 刷新访问令牌的路由
app.post('/token', (req, res) => {
  const refreshToken = req.body.token;
  
  if (!refreshToken) {
    return res.status(401).send('未提供刷新令牌');
  }

  
  jwt.verify(refreshToken, refreshSecret, (err, user) => {
    if (err) {
      return res.status(403).send('无效的刷新令牌');
    }
    
    // 生成新的访问令牌
    const accessToken = jwt.sign({ userId: user.userId }, accessSecret, { expiresIn: '15m' });
    res.json({ accessToken });
  });
});

七、安全最佳实践

  1. 密钥管理

    • 使用强密钥并存储在环境变量中。
    • 对于生产环境,考虑使用非对称加密(RS256)。
  2. 令牌过期

    • 设置合理的过期时间。
    • 实现刷新令牌机制。
  3. 防止篡改

    • 不要在 JWT 中存储敏感信息(如密码)。
    • 对敏感信息进行加密。
  4. 重放攻击

    • 对刷新令牌实现失效机制。

    • 考虑添加 JTI(JWT ID)声明并维护令牌黑名单。

小项目:

        更改go最后项目 为nodejs 后端(项目地址 :GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/chxii/NodeJS_01)

1.14 express小项目 和 用到的 jwt详解_第1张图片

你可能感兴趣的:(vue3,#,nodejs,node.js)