使用 Node.js 实现基于 JWT 的身份验证及授权教程

随着 Web 应用的普及,用户身份验证和授权成为了应用开发的必要步骤。传统的基于 session 的身份验证已经不再适用于现代应用的需求,因为 session 跨站点状态管理比较麻烦,而且需要在服务器端维护会话,带来了很大的开销。JWT(JSON Web Token)是一种基于 token 的身份验证方式,它可以在客户端存储身份验证信息,减轻了服务器端的负担。本文将介绍如何使用 Node.js 实现基于 JWT 的身份验证和授权。

什么是 JWT?

JWT 是一种基于 token 的身份验证方案,它使用 JSON 数据格式存储用户信息,并使用签名保证安全性。JWT 由三部分组成:

  • Header:存储加密算法和其他元数据的对象。
  • Payload:存储用户信息的对象。
  • Signature:存储签名的字符串。

JWT 可以在客户端存储,通常放在 LocalStorage 或者 Cookie 中。客户端将 JWT 发送到服务器进行身份验证,在服务器端通过验证 JWT 的签名来确认用户是否有权限访问。

实现 JWT 身份验证

基于 JWT 的身份验证流程如下:

  1. 用户进行身份验证,将用户名和密码提交到服务器。
  2. 服务器认证用户身份,生成 JWT 并返回给客户端。
  3. 客户端保存 JWT,每次请求时将 JWT 发送到服务器。
  4. 服务器验证 JWT,如果 JWT 有效,则返回对应资源,否则返回错误信息。

在 Node.js 中使用 JWT 需要先安装 jsonwebtoken 模块。

--- ------- ------------

下面是一个使用 JWT 进行身份验证的例子。

----- --- - ------------------------
----- ------- - -------------------
----- ---------- - -----------------------

----- --- - ----------
--------------------------- -- -- ---------------- ------

----- ----- - -
  - --- -- --------- -------- --------- ------- --
  - --- -- --------- ------- --------- ------ -
--

----- ------ - ----------------- -- --- ----

-- ----
------------------ ----- ---- -- -
  ----- - --------- -------- - - ---------
  ----- ---- - ------------ -- ---------- --- -------- -- ---------- --- ----------
  -- ------ -
    -- -- ---
    ----- ----- - ---------- --- -------- --------- ------------- -- --------
    ---------- ----- ---
  - ---- -
    ---------------------- ------ ----------- ---
  -
---

-- --------
--------------------- ----- ---- -- -
  -- ------ ---
  ----- ---------- - --------------------------
  -- ------------ -
    -- -- ---
    ----- ----- - ------------------ ------
    ----------------- ------- ----- -------- -- - -- -- --- --
      -- ----- -
        ---------------------- ------ ---- ---- ---
      - ---- -
        ---------- -------- ------- - - ---------------- ---
      -
    ---
  - ---- -
    ---------------------- ------ ---- ---- ---
  -
---

---------------- -- -- -
  ------------------- --------- -- ------------------------
---

这个例子中,我们定义了两个接口 /login/protected

/login 接口接收用户名和密码,认证用户身份,并生成 JWT 发送给客户端。如果验证失败,则返回 401 状态码。/protected 用于获取受保护的资源,它会检查请求头中是否包含 JWT,如果包含 JWT,则解析并进行签名验证。如果 JWT 有效,则返回资源的内容,否则返回 401 状态码。

实现 JWT 授权

除了身份验证,我们还需要授权机制来限制用户能否访问某些资源。JWT 授权是基于角色或权限的,可以使用一个字段来表示用户的角色或权限。

在 Node.js 中可以使用中间件来实现 JWT 授权。下面是一个使用 JWT 进行授权的例子。

-- ------- ----- - ------

-- ------- --
-------- ---------------- -
  ------ ----- ---- ----- -- -
    -- ------ ---
    ----- ---------- - --------------------------
    -- ------------ -
      -- -- ---
      ----- ----- - ------------------ ------
      ----------------- ------- ----- -------- -- -
        -- ----- -
          ---------------------- ------ ---- ---- ---
        - ---- -
          -- ----------
          -- ------------------------------ - -- ----- ----------
            -------- - -------- -- ----------
            ------- -- -----------------
          - ---- -
            ---------------------- ------ ------ ---
          -
        -
      ---
    - ---- -
      ---------------------- ------ ---- ---- ---
    -
  --
-

-- ---------
----------------- --------------------- ----- ---- -- -
  -- ---
---

-- ----------
---------------- -------------------- ----- ---- -- -
  -- ---
---

这个例子中,我们定义了一个中间件 authorize 用于授权。authorize 函数接收一个角色列表作为参数,返回一个中间件函数。中间件函数会从请求头中获取 JWT,解析并进行签名验证,然后对比用户的角色和角色列表是否符合要求,如果符合则保存已认证的用户信息,并继续执行下一个中间件或路由处理函数。否则返回 403 状态码。

我们可以在路由处理函数中使用 req.user 来获取已认证的用户信息。

----------------- --------------------- ----- ---- -- -
  ----- ---- - ---------
  ---------- -------- ------- - - ------------- ---
---

总结

本文介绍了如何使用 Node.js 实现基于 JWT 的身份验证及授权。JWT 身份验证可以减轻服务器的负担,而 JWT 授权可以提供精细的权限控制。这对于开发大型 Web 应用来说至关重要,希望本文对大家有所帮助。下面是本文的代码示例:

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64ffdc4295b1f8cacde2356d


猜你喜欢

  • 使用 Jest 测试框架测试 Node.js 应用

    在前端开发中,测试是所有开发过程中必不可少的一环。有很多测试框架可供选择,但 Jest 是最流行的一个。它是一个简单易用的 JavaScript 测试框架,可以用于测试前端和后端应用程序。

    1 年前
  • 经验谈:Docker 容器部署 Django 项目实用方案及遇到的问题解决

    一、背景 随着近年来 Docker 技术的普及,越来越多的开发者开始使用 Docker 容器部署自己的应用程序。在这个过程中,Django 也成为了众多 Web 开发者的首选框架之一。

    1 年前
  • Serverless 架构下的容器部署

    Serverless 架构是一种新兴的、基于事件驱动的云计算架构,它将所有的服务器管理都交给了 Cloud Provider,使得开发者不需要关注服务器的配置和维护,只需要关注自己的业务逻辑,并以函数...

    1 年前
  • Vue SPA 使用 axios 拦截器实现异步请求校验

    在构建单页面应用时,经常需要向后端发起异步请求。由于这些请求涉及用户信息、数据合法性等敏感信息,必须对发送的请求进行校验,以确保数据的完整性和安全性。Vue 提供了一个优秀的 HTTP 库——axio...

    1 年前
  • 在 Next.js 项目中使用 Antd UI 库的实践经验分享

    Antd 是一款基于 React 的优秀 UI 库,提供了很多常用 UI 组件,方便开发者快速搭建页面。而 Next.js 则是一款支持服务端渲染的 React 框架,可以在一定程度上提升页面性能。

    1 年前
  • Kubernetes 项目中的日志处理 —— Fluentd 的使用与深入剖析

    在 Kubernetes 集群中,日志处理是一个非常重要的任务。由于集群中日志产生的数量巨大,为了保证系统稳定,需要对日志进行详细的收集、分析和处理。本文将深入介绍在 Kubernetes 中使用 F...

    1 年前
  • 如何在 GraphQL 中使用 JWT 进行身份认证?

    前言 随着现代应用程序的需求,身份认证已成为很普遍的应用功能。JSON Web Tokens (JWT) 已成为一种流行且安全的 token 格式,他可以用作用户认证和授权。

    1 年前
  • ECMAScript 2016 中的正则表达式之 Named Capturing Groups

    正则表达式在前端开发中有着广泛的应用,它可以用来检查和操作字符串。在 ECMAScript 2016 中,引入了一个新的特性:命名捕获组(Named Capturing Groups),它能够更方便地...

    1 年前
  • 在 Angular 应用程序中解决 JSON 循环引用错误

    什么是 JSON 循环引用错误? 在 Angular 应用程序中,我们常常需要从服务器获取 JSON 数据。JSON 数据是一种轻量级的数据交换格式,用于在客户端和服务器之间传输数据。

    1 年前
  • ECMAScript 2021(ES12) 中的 Promise.any() 方法详解

    Promise.any() 是 ECMAScript 2021(ES12) 中新增的方法,它将多个 Promise 实例包装成一个新的 Promise 实例,只要其中一个 Promise 实例状态变为...

    1 年前
  • Hapi 框架的 JWT 验证技巧

    在前端开发中,经常需要进行用户身份验证。传统的验证方式是使用 session,但是随着前后端分离的趋势,使用 token 来验证身份逐渐成为了主流。 在使用 Hapi 框架开发后端 API 的过程中,...

    1 年前
  • 如何使用 LESS 优化 CSS 性能

    在前端开发中,CSS 扮演着关键的角色,但是样式代码的复杂性和行数增加,会导致加载时间变慢和性能下降。LESS 是一种预处理器,使用它可以帮助前端工程师减少样式代码的复杂性,提高代码可维护性,并优化 ...

    1 年前
  • Deno 中的 HTTP/2 服务器搭建

    在传统的 Web 服务器中,我们通常使用 HTTP/1.1 协议作为通信协议。然而,HTTP/2 作为它的继任者,在性能和安全方面都有了很大的提升。在 Deno 中,搭建一个支持 HTTP/2 协议的...

    1 年前
  • ECMAScript 2017 (ES8) 引入 Object.getOwnPropertyDescriptors() 方法

    在 ECMAScript 2017 (ES8) 中,引入了 Object.getOwnPropertyDescriptors() 方法,该方法返回指定对象的所有属性的描述符。

    1 年前
  • 在 React 项目中使用 RxJS 中的 observable.try 和 catchError 遇到问题的解决方法

    在 React 项目中使用 RxJS 中的 observable.try 和 catchError 遇到问题的解决方法 RxJS 是一个基于发布-订阅模式的 JavaScript 库,它提供了用于处理...

    1 年前
  • React Hooks 实现状态管理与 context 的结合使用

    React Hooks 是 React v16.8 版本中引入的新特性,它能够让函数组件拥有类组件的功能,同时也让代码更加简洁易读。在 React 应用中,状态管理是必不可少的,而 React Hoo...

    1 年前
  • 无服务器函数:使用 GCP Cloud Functions 构建 Serverless 应用

    服务器负责处理、存储和传输数据,同时也是应用开发中需要最多投资的部分之一。无服务器架构可以让开发者迅速部署代码而无需担心服务器配置,从而节省了开发时间,白嫖别人的资源啊~ Google Cloud ...

    1 年前
  • AngularJS 1.x SPA 中使用强类型传参避免 bug

    在 AngularJS 1.x 单页面应用(SPA)中,传参是非常常见的操作。然而,在传参时往往容易出现类型错误或者空指针引用等 bug。为了避免这些问题,我们可以使用强类型传参的做法,以确保参数的正...

    1 年前
  • Sequelize 中使用 Op.and 等操作符实现多个查询条件查询及示例

    在 Sequelize 中,开发者可以使用各种查询操作符通过 JavaScript 对数据库进行查询,其中 Op.and 操作符可以用于同时满足多个查询条件的查询操作。

    1 年前
  • SSE 在 Express 中的应用场景与技巧

    随着 Web 应用逐渐从传统的多页面应用转变成单页面应用,实时性越来越成为开发者关注的焦点。Server-Sent Events(SSE)是一种实时通信协议,它允许浏览器与服务器之间保持长连接,实现单...

    1 年前

相关推荐

    暂无文章