Node.JS如何实现JWT原理

yizhihongxing

JWT(JSON Web Token)是一种开放标准,它允许将信息作为 JSON 对象进行安全地传输。JWT 在身份验证和授权应用程序中得到广泛使用。Node.js 提供了各种库和模块来实现 JWT,包括 jsonwebtoken 和 express-jwt。下面是使用 Node.js 实现 JWT 的过程步骤。

步骤1:安装所需库

首先,我们需要安装所需的依赖库,包括jsonwebtoken和express。在终端中使用以下命令来安装这些库:

npm install --save jsonwebtoken express

步骤2:创建 JWT

接下来,我们需要使用 jsonwebtoken 库创建 JWT。JWT 包含三个部分:头部、载荷和签名。这些部分使用 Base64 编码,其中头部和载荷使用 Base64Url 编码。

下面是一个示例,使用 Node.js 生成 JWT:

const jwt = require('jsonwebtoken');
const secret = 'mysecretkey';
const payload = { name: 'John Doe', email: 'johndoe@example.com' };
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
console.log(token);

在这个示例中,我们创建了一个名为 payload 的包含姓名和电子邮件的对象,然后使用 jsonwebtoken 库的 sign() 方法生成 JWT。其中,secret 是加密密钥,expiresIn 参数指定 JWT 的过期时间。运行时应当输出如下所示的 JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2MTI1NjEwMDIsImV4cCI6MTYxMjU2NDYwMiwibmFtZSI6IkpvaG4gRG9lIiwiZW1haWwiOiJqb2huZG9lQGV4YW1wbGUuY29tIn0.2QpWESw6fJlCVOIb0oeN9u3vPjQJql9-vi-wyg7iF7s

如果需要解码 JWT,我们可以使用 jwt.decode() 方法:

const decodedToken = jwt.decode(token);
console.log(decodedToken);

这将输出以下内容:

{
  iat: 1612561002,
  exp: 1612564602,
  name: 'John Doe',
  email: 'johndoe@example.com'
}

步骤3:验证 JWT

在使用 JWT 进行身份验证时,我们需要验证 JWT 是否正确,这可以通过检查签名来完成。我们可以使用 jsonwebtoken 库的 verify() 方法来验证 JWT,如下所示:

const verifiedToken = jwt.verify(token, secret);
console.log(verifiedToken);

如果 JWT 验证成功,则会输出与解码相同的内容:

{
  iat: 1612561002,
  exp: 1612564602,
  name: 'John Doe',
  email: 'johndoe@example.com'
}

示例1:使用 JWT 进行身份验证

下面是一个示例,使用 JWT 进行身份验证:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

app.use(express.json());

const users = [
  { id: 1, username: 'johndoe', password: 'password123' },
  { id: 2, username: 'janedoe', password: 'password456' }
];

const secret = 'mysecretkey';

function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (token == null) return res.sendStatus(401);

  jwt.verify(token, secret, (err, user) => {
    if (err) return res.sendStatus(403);

    req.user = user;
    next();
  });
}

app.post('/login', (req, res) => {
  const { username, password } = req.body;

  const user = users.find(u => u.username === username && u.password === password);

  if (user == null) return res.sendStatus(401);

  const token = jwt.sign({ username: user.username }, secret);

  res.json({ token });
});

app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: `Hello, ${req.user.username}!` });
});

在该示例中,我们使用 Express 建立一个简单的应用程序。该程序分为三个部分:

  1. 通过调用 jwt.sign() 创建 JWT。
  2. 通过在请求头中包含 JWT,使用 authenticateToken() 进行身份验证。
  3. 在成功验证后,使用 req.user 输出受保护的信息。

我们可以使用 Postman 或类似工具发送 POST 请求到 /login 路径进行登录操作,并发送 GET 请求到 /protected 路径查看受保护信息。

示例2:在 Express.js 中使用中间件

我们也可以在 Express.js 中使用 jsonwebtoken 库提供的中间件进行身份验证,如下所示:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

app.use(express.json());

const users = [
  { id: 1, username: 'johndoe', password: 'password123' },
  { id: 2, username: 'janedoe', password: 'password456' }
];

const secret = 'mysecretkey';

function generateToken(user) {
  return jwt.sign({ id: user.id, username: user.username }, secret);
}

function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (token == null) return res.sendStatus(401);

  jwt.verify(token, secret, (err, user) => {
    if (err) return res.sendStatus(403);

    req.user = user;
    next();
  });
}

app.post('/login', (req, res) => {
  const { username, password } = req.body;

  const user = users.find(u => u.username === username && u.password === password);

  if (user == null) return res.sendStatus(401);

  const token = generateToken(user);

  res.json({ token });
});

app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: `Hello, ${req.user.username}!` });
});

app.listen(3000, () => console.log('Server running on port 3000'));

在该示例中,我们使用 Express 中提供的中间件机制,将验证逻辑封装到 authenticateToken() 函数中,并将其作为中间件应用于路由。如果用户有足够的权限,即带有有效的 JWT,中间件将允许请求继续到路由处理程序。通过这种方式,我们可以轻松地在整个应用程序中重用身份验证逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.JS如何实现JWT原理 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • node.js入门学习之url模块

    Node.js入门学习之url模块 什么是url模块? url模块是Node.js标准库中的一个模块,主要用于处理和解析URL地址。 如何使用url模块? 要使用url模块,首先需要使用require方法引入: const url = require(‘url’); 然后就可以使用url模块提供的方法了。 url.parse方法 url.parse()方法用…

    node js 2023年6月8日
    00
  • node.js中的fs.writeFileSync方法使用说明

    当我们需要在Node.js中写入文件时,可以使用fs模块提供的fs.writeFileSync方法(同步写入文件)。fs.writeFileSync方法需要接受两个参数,第一个是文件路径,第二个是写入的内容。 下面我将详细讲解如何正确使用fs.writeFileSync方法: 1. 导入fs模块 fs是Node.js的一个核心模块,我们需要先导入fs模块,才…

    node js 2023年6月8日
    00
  • 测试驱动ChatGPT编程示例详解

    下面就是测试驱动ChatGPT编程示例的完整攻略: 总述 第一步是准备好ChatGPT模型。ChatGPT是一种语言模型,可以进行自然语言生成。它的原理是基于大量文本数据进行训练,并且在训练好的基础上进行生成。 第二步是准备好ChatGPT的测试数据集。这个测试数据集可以来源于真实的人机对话,也可以仿真出来。测试数据集的作用是验证ChatGPT模型的生成效果…

    node js 2023年6月8日
    00
  • NodeJS创建基础应用并应用模板引擎

    下面是“NodeJS创建基础应用并应用模板引擎”的完整攻略: 1. 准备工作 在开始创建基础应用之前,我们需要确保已经安装了Node.js。可以在命令行或终端中运行以下命令验证: node -v 如果能够输出 Node.js 的版本号,即表明已经安装成功。 2. 创建基础应用 使用以下命令可以快速创建一个空的Node.js应用: mkdir myApp //…

    node js 2023年6月8日
    00
  • 如何使用puppet替换文件中的string

    使用puppet替换文件中的string,可以通过file_line和replace两个puppet的资源来实现。 file_line资源替换指定行的内容 file_line可以用来替换指定文件中的一行内容。具体的使用方式为: file_line { ‘description’: path => ‘/path/to/file’, line => …

    node js 2023年6月8日
    00
  • 浅析Node.js的Stream模块中的Readable对象

    浅析Node.js的Stream模块中的Readable对象 前言 在Node.js中,Stream是一个基础模块之一,负责处理数据流。它主要分为可写流(Writable)、可读流(Readable)以及双工流(Duplex)和转换流(Transform)四种类型。其中,我们今天将会重点探讨可读流(Readable)的属性和方法,以及如何使用它从流中读取数据…

    node js 2023年6月8日
    00
  • js宝典学习笔记(上)

    JS宝典学习笔记(上)攻略 1. 了解JS基础语法 要学习JS,首先要掌握其基础语法。包括: 变量、常量的定义和使用; 数据类型、运算符等基本概念; 流程控制、函数、循环等基本语句的使用。 建议通过《JavaScript高级程序设计》等经典教材,辅以实战演练和练习,掌握JS基础语法。 2. 掌握DOM操作 DOM(文档对象模型)是JS的重要组成部分。掌握DO…

    node js 2023年6月8日
    00
  • 详解使用nodeJs安装Vue-cli

    请跟我一起来详解使用Node.js安装Vue-cli的完整攻略。 1. 安装Node.js Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,可以用于服务器端JavaScript环境的搭建。因为Vue-cli是基于Node.js开发的,所以安装Node.js是使用Vue-cli的前提。Node.js支持多操作系统安装,例如Win…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部