Node.JS如何实现JWT原理

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日

相关文章

  • Nodejs Stream 数据流使用手册

    Node.js Stream 数据流使用手册 Node.js 的数据流(Stream)是一种可读写的、基于事件的API。它们是在处理大量数据时非常有用的工具。Node.js中的Stream属性非常实用,可以帮助我们大大提高服务器的性能。 数据流(Stream)概述 数据流是一种抽象的界面,它让我们可以像读写文件一样读写数据。 Node.js在 fs 和 ne…

    node js 2023年6月8日
    00
  • 重学 JS:为啥 await 不能用在 forEach 中详解

    当我们使用 async/await 来处理异步函数时,有可能会遇到在 forEach 循环中使用 await 语句,导致 await 处理不完整的问题,这是因为 forEach 循环的特殊性导致的。 问题 forEach 循环是 JavaScript 提供的一种遍历数组的方式,常用于对数组中的每一项进行操作,语法如下: array.forEach(callb…

    node js 2023年6月8日
    00
  • node.js实现身份认证的示例代码

    首先,我们需要了解身份认证的基本概念和流程。身份认证是指验证用户所提供的身份信息是否正确和有效。在前后端分离的应用中,身份认证通常采用 token 认证的方式,即客户端在登录后,向服务端获取 token 并保存到本地,后续的每次请求需要带上这个 token 来进行身份认证。在 node.js 中,主要使用 express 和 jsonwebtoken 两个库…

    node js 2023年6月8日
    00
  • Node.js Continuation Passing Style( CPS与回调)

    Node.js是一个基于事件驱动、非阻塞I/O模型的JavaScript运行环境。而 Continuation Passing Style(CPS)也是Node.js中非常重要的编程风格,它主要用于处理异步编程。本文将详细讲解Node.js Continuation Passing Style( CPS与回调)的完整攻略,并通过代码示例进行说明。 什么是Co…

    node js 2023年6月8日
    00
  • JS实现将链接生成二维码并转为图片的方法

    下面是“JS实现将链接生成二维码并转为图片的方法”的完整攻略。 步骤1:引入qrcode和html-to-image库 为了方便生成二维码和将二维码转化为图片,我们需要先引入qrcode和html-to-image库。 <head> <script src="https://cdn.staticfile.org/html-to-i…

    node js 2023年6月8日
    00
  • golang执行命令操作 exec.Command

    关于golang中执行命令操作exec.Command的攻略,我可以提供以下的详细讲解。 1. 执行命令 首先,我们需要导入Go的os/exec包。然后,就可以使用Command函数执行命令。它接受一个字符串参数,这个字符串包含了要执行的命令及其参数。 package main import ( "fmt" "os/exec&q…

    node js 2023年6月8日
    00
  • 轻松创建nodejs服务器(3):代码模块化

    下面为您详细讲解“轻松创建nodejs服务器(3):代码模块化”的完整攻略。 什么是代码模块化 代码模块化是指将代码按照一定的规则拆分成不同的模块,使得代码可重用、可维护、可拓展。在Node.js中,代码模块化是十分重要的一环,通过代码模块化可以让我们更加轻松地管理我们的项目,提高代码的可重用性和可维护性。 如何实现代码模块化 在Node.js中,实现代码模…

    node js 2023年6月8日
    00
  • NodeJS学习笔记之Http模块

    现在我将为你详细讲解“NodeJS学习笔记之Http模块”的完整攻略。 NodeJS学习笔记之Http模块 Http简介 在Node.js中提供了一个Http模块,专门用于处理网络请求和响应。通过该模块,我们能够很容易地搭建一个Web服务器并提供Web服务。 创建服务器 我们可以使用Node.js提供的Http模块来创建一个简单的Web服务器。示例如下: c…

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