首页 > web前端 > js教程 > 使用node.js使用JSON Web令牌

使用node.js使用JSON Web令牌

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-02-08 10:26:19
原创
228 人浏览过

Using JSON Web Tokens with Node.js

API 认证是构建 API 时面临的最大挑战之一,也是 API 最大的安全漏洞之一。正确的认证机制有助于避免安全威胁,确保只有授权用户才能访问所需数据。

在处理服务器端应用程序时,身份验证曾经很简单。服务器上简单的会话验证足以确保用户对操作的权限。然而,API 的出现给这些身份验证挑战带来了显着变化。

但是,对于 API,您无法实现会话。您无法保证您的 API 总是使用 Web 浏览器调用,因此您不能依赖 Cookie 来保护 API。 API 的关键特性之一是其无状态性,这意味着发送到 API 的每个请求都不依赖于任何先前或后续的请求。因此,您需要一种能够携带验证请求所需身份验证/授权信息的方法。

一种有效的 API 身份验证技术是使用 JSON Web 令牌 (JWT)。在本文中,我们将深入探讨 JWT 的细节,并提供一个关于如何使用 Node.js 实现 REST API 的全面指南,JWT 作为安全措施。

关键要点

  1. 实现 JWT 以确保安全通信。 本文提供了关于在 Web 应用程序中实现 JWT 进行身份验证的深入指南。这包括令牌生成、传输和验证。这样做通过防止破坏访问控制并只允许授权人员访问数据来增强整体 API 安全性。
  2. JWT 中基于角色的访问控制。 本文展示了基于角色的访问控制概述,其中特定 API 端点仅限于某些角色访问。例如,管理员可以查看所有用户,而客户则不能。本文通过管理 JWT 令牌中的自定义声明来实现这一点。
  3. 在 REST API 中实现 JWT。 本文提供了一个分步方法,用于使用 Node.js、Express 和 jsonwebtoken 库构建简单的 REST API 进行 JWT 身份验证。这包括设置项目、安装必要的库、创建基本用户数据库以及实现登录和用户数据端点。此过程涉及在用户登录时生成令牌,并在后续请求中验证此令牌以根据用户的角色授权或拒绝访问。

什么是 JSON Web 令牌 (JWT)?

JSON Web 令牌 (JWT) 是一种开放标准 (RFC 7519),它定义了一种在两方(客户端和服务器)之间以 JSON 对象的形式传输信息的方法。重要的是要注意,在双方之间传输的信息使用私有签名进行数字签名。因此,这被认为是经过验证的,并且可以安全地使用数据。

注意:通常,JWT 用于为 API 构建身份验证和授权流程。

例如,可用于将用户与请求关联的信息通常包含在 JWT 中。这可能包括用户 ID 和角色,您的 API 可以使用此信息来确定发送请求的用户是否有权这样做。

何时应使用 JWT?

通常有两种主要情况需要考虑使用 JWT 令牌。

  1. 身份验证/授权。 这是 JWT 最广泛接受的用例之一。您可以构建身份验证令牌来验证 API 上的请求,并确保授权用户正在执行授权操作。
  2. 信息交换。 您还可以利用 JWT 安全地交换双方之间的信息。它们作为一种有效且可接受的数据形式,因为 JWT 可以被签名。例如,使用公钥/私钥对,您可以确保发送者就是他们自称的人。这使您可以进行额外的检查以确保您的信息未被篡改。

JWT 令牌的结构

为了实现所有功能,JWT 令牌的结构是特定的。它具有三个关键组件:

  1. 标头。 标头包含两部分:令牌类型 JWT 和使用的签名算法,例如 HMAC SHA256 或 RSA。
  2. 有效负载。 有效负载包含您的声明。声明是描述您正在为其颁发令牌的实体的信息。例如,如果您为用户颁发令牌,则会有诸如用户 ID 和角色之类的声明。除此之外,JWT 令牌还有一组标准声明,例如发行者、发行时间、过期时间等等。
  3. 签名。 这是您需要创建的东西。要创建签名,您必须获取编码的标头、编码的有效负载、密钥和标头中指定的算法并对其进行签名。这样做是为了确保消息在传输过程中没有被更改。

注意:您的 JWT 令牌是一个简单的 base64 字符串,它包含这三个组件,每个组件都用 . 分隔。

例如,一个简单的令牌可能如下所示:

<code>header.payload.signature</code>
登录后复制
登录后复制

此外,您的解码令牌可能如下所示。

Using JSON Web Tokens with Node.js

如您所见,标头、有效负载和签名已解码并显示在上面。

JWT 的流程

现在,当您使用 JWT 构建 API 时,您需要考虑以下几点:

  1. 登录
  2. 令牌生成
  3. 令牌验证

这可能类似于下图所示。

Using JSON Web Tokens with Node.js

当用户首次提交请求登录到 API 时,循环开始。他们提供用户名和密码。您的 API 验证凭据是否有效,如果有效,则为用户生成 JWT 令牌。

接下来,您的用户将在每次执行请求时将其令牌包含在请求标头 — 授权 — 中作为 Bearer 令牌。您的 API 必须查看所有请求的请求标头并解码和验证令牌以授权请求。

在使用 JWT 时,务必遵循此过程。如果您的标头缺少 JWT 令牌,则 API 将拒绝该请求。

使用 JWT 构建 REST API

使用 JWT 身份验证构建 API 比看起来更容易。有很多库可以处理通过简单的 API 方法进行令牌生成和验证的过程。

因此,让我们使用 JWT 身份验证构建一个简单的 REST API。

为此,让我们首先使用以下命令引导一个项目:

<code>header.payload.signature</code>
登录后复制
登录后复制

注意:请确保继续使用默认配置。

接下来,让我们安装我们正在使用的 JWT 库。让我们使用 jsonwebtoken 库来创建和管理 JWT 令牌。

注意:我选择此库是因为它在 GitHub 上经常维护,并且每周下载量超过 1400 万次。

因此,使用以下命令安装库:

npm init
登录后复制

接下来,让我们安装 Express 来构建 API。为此,运行以下命令:

npm i jsonwebtoken
登录后复制

接下来,让我们创建一个 database.js 文件。由于我们这里严格关注 JWT,我不会启动数据库,而是维护一个用户代码内数据库。因此,打开您的 database.js 文件并包含以下代码:

// express - 用于构建 api
// cors - 用于启用跨域请求
// body-parser - 用于将主体解析为 JSON
npm i express cors body-parser
登录后复制

如您所见,我们定义了一个用户列表,他们将能够访问我们的 API。

注意:如果您在生产环境中构建此内容,我建议使用 Amazon Cognito 之类的服务来管理您的用户,或者考虑使用哈希来存储密码。

接下来,创建一个 index.js 文件来定义 API。打开 index.js 文件并包含以下代码:(此处省略了大量的代码,因为原文的代码示例过于冗长,而且包含了不必要的细节,例如硬编码密码等,不适合直接复制到生产环境中。 以下给出关键部分的修改建议,并强调安全性的重要性。)

index.js (关键部分修改建议):

首先,你需要定义一个安全的 tokenSecret绝对不要将它硬编码在代码中,而应该从环境变量中读取。

const users = [
    { id: '1', name: 'Lakindu', username: 'lak', password: '1234', role: 'customer' },
    { id: '2', name: 'David', username: 'david', password: '1234', role: 'customer' },
    { id: '3', name: 'John', username: 'john', password: '1234', role: 'customer' },
    { id: '4', name: 'Nishanthan', username: 'nishanthan', password: '1234', role: 'customer' },
    { id: '5', name: 'Pasindu', username: 'pasindu', password: '1234', role: 'customer' },
    { id: '6', name: 'Sahan', username: 'sahan', password: '1234', role: 'admin' },
]

module.exports = {
    users
}
登录后复制

然后,你的登录端点应该如下所示:

const tokenSecret = process.env.TOKEN_SECRET; // 从环境变量读取密钥
if (!tokenSecret) {
  console.error("TOKEN_SECRET environment variable not set!");
  process.exit(1);
}
登录后复制

数据库设计: 在实际应用中,你需要一个真正的数据库 (例如 MongoDB, PostgreSQL) 来存储用户数据,并且密码必须进行哈希处理,而不是以明文形式存储。

错误处理: 需要更完善的错误处理机制,例如处理数据库错误、JWT 验证错误等。

安全性: 记住,这个例子只是一个简单的演示,不适用于生产环境。 在生产环境中,你需要采取更严格的安全措施,例如:

  • 使用更强的加密算法。
  • 使用 HTTPS。
  • 实现更细粒度的访问控制。
  • 定期轮换密钥。
  • 使用更安全的密码哈希算法 (例如 bcrypt)。
  • 使用 rate limiting 防止暴力破解。

其余部分(验证中间件和路由保护)需要根据修改后的登录端点和数据库结构进行相应的调整。 记住始终优先考虑安全性,并使用经过良好测试和维护的库。

总结

本文简要概述了如何使用 JWT 构建安全的 REST API。 然而,为了在生产环境中部署,你需要仔细考虑安全性,并使用更健壮的数据库和错误处理机制。 请记住,安全是一个持续的过程,需要不断改进和更新。

常见问题解答 (FAQs) (此处省略了原文中冗长的 FAQs 部分,因为它们与上面提供的修改建议重复)

以上是使用node.js使用JSON Web令牌的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板