Hapi 框架用 JWT 做权限控制:详细操作指南

在前端应用中,我们经常需要对用户的权限进行限制。Hapi 框架是一个流行的 Node.js 框架,它有很方便的插件来配合 JSON Web Token(JWT)做权限控制。JWT 是一种在网络应用中传递信息的标准。本文将详细介绍如何在 Hapi 框架中使用 JWT 来做权限控制。

什么是 JWT?

JWT 是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式传输信息。在 JWT 中,实体(通常指用户)将信息包装在 JSON 对象中,并使用密钥加密,然后将其转换为字符串格式。以后,实体可以通过传递 JWT 来验证其身份。已加密的 JWT 中的信息不能修改,因此它是一种安全且可靠的身份验证方法。

Hapi 插件:hapi-auth-jwt2

在 Hapi 中,我们可以使用 hapi-auth-jwt2 插件来完成 JWT 的验证。

安装 hapi-auth-jwt2

首先,在您的项目中安装 hapi-auth-jwt2:

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

配置 JWT 策略

在您的 Hapi 服务器初始化代码中,需要配置要使用的 JWT 策略。以下是一个例子:

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

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

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

在这个例子中,我们先调用 Hapi 的 server.register 方法来注册 hapi-auth-jwt2 插件。 然后,我们使用 server.auth.strategy 方法来定义一个名为“jwt”的策略。 在这里,我们需要指定:

  • key:JWT 的密钥,用于验证 JWT 的有效性。
  • validateFunc:用于验证 JWT 中的信息是否已验证成功的函数。这个函数需要接收两个参数,即 JWT 从中解析出的载荷和“回调”函数。回调函数应该在传入的载荷上回调以指示验证成功或失败。以下是一个 validateFunc 的例子:
-------- ----------------- -------- --------- -
    -- -----------------
    -- ------------------------
    ------ -------------- ----- ---------
-
  • verifyOptions:这是 JSON Web Tokens 库所需的验证选项。 在这里,我们使用诸如“ALG”(算法)之类的选项来指定要使用的加密算法(在此示例中为 HS256)。
  • auth:用于指定在路由级别上使用此策略。

之后,我们使用 server.route 定义了一个只能由已经验证过 JWT 的用户访问的路由。在这个例子中,我们设置了 auth 参数以指定使用名为“jwt”的策略。 如果用户未在访问此路由时提供有效的 JWT,则该插件将返回一个验证错误。如果用户提供一个有效的 JWT,那么该路由就会被执行。 在这种情况下,它只是返回了一个字符串:“restricted data”。

这只是一个简单的例子,但它演示了如何在 Hapi 中使用 JWT 做权限控制。 在实际的应用程序中,您可能需要:

  • 在载荷中包含更多的用户数据,例如用户的角色、访问权限等。
  • 将策略与数据库中的用户集成起来。
  • 定义更多策略来处理不同的身份验证情况。

示例代码

以下是更完整的代码示例,演示了如何在 Hapi 中使用 JWT 做权限控制。这个例子使用 MongoDB 作为数据库。在这个例子中,我们实现了两个路由:

  • /token:这是验证用户身份的入口点。 它需要一个包含用户名和密码的正文。 如果用户名和密码有效,则返回一个 JWT。
  • /restricted:这是一个受限的路由,需要 JWT 才能访问。
----- ---- - ----------------
----- --- - ------------------------
----- ------- - -------------------
----- ------ - ------------------
----- ----- - ---------------------------
----- ------- - --------------------------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

可以使用 Postman 来测试此示例。 在请求头中,将“Content-Type”设置为“application/json” , 在正文中输入包含用户名和密码的 JSON 对象,例如:

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

发生 GET 请求到 /token,您应该得到如下所示的 JSON 响应:

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

现在,您可以使用此 JWT 来访问 /restricted 路径。 为此,请向 GET 请求添加一个“Authorization”标头,如下所示:

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

如果 JWT 有效,则应看到以下响应:

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

如果 JWT 无效,则插件将返回一个验证错误。

总结

在本文中,我们介绍了如何在 Hapi 框架中使用 JWT 来做权限控制。我们学习了 hapi-auth-jwt2 插件,以及如何配置 JWT 策略。我们还提供了一个完整的示例代码,用于演示如何将 JWT 集成到基于 Hapi 的 Node.js 应用中。现在,您可以在自己的项目中使用 Hapi 和 JWT 做权限控制了!

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


猜你喜欢

  • 从 MySQL 到 MongoDB,详解 Mongoose 中数据模型的创建与理解

    随着互联网技术的快速发展,越来越多的业务场景需要处理大量复杂数据。为了解决传统 RDBMS 数据库在处理海量数据时出现的性能瓶颈,NoSQL 数据库开始逐渐受到越来越多的关注和应用。

    1 年前
  • Vue.js 中如何实现拖拽排序组件

    在前端开发中,拖拽排序是一个很常见的交互功能。在 Vue.js 中,我们可以通过自定义组件来实现拖拽排序的功能。 基本思路 在 Vue.js 中实现拖拽排序的基本思路是: 使用 HTML5 中的拖拽...

    1 年前
  • 高性能 WEB 服务端架构优化实践

    在快速发展的互联网时代,为了满足用户高速增长的需求,高性能 WEB 服务端架构优化变得非常重要。本文将介绍几种优化实践,包括应用程序的架构、缓存、负载均衡以及数据库的优化,帮助您构建一个高性能的 WE...

    1 年前
  • 如何使用 Fastify 实现配置文件的读取和管理?

    在前端开发中,配置文件扮演着至关重要的角色,它们是应用程序的基本构建块之一。可以将配置文件看作是一个包含所有应用程序的重要信息和设置的文本文件。在很多情况下,使用 configuration 文件来管...

    1 年前
  • Redis 模块开发:如何实现自定义数据结构?

    前言 Redis 是一个非常流行的开源内存数据库,它支持各种数据结构,如字符串、哈希、列表、集合等等。但是对于某些特定的需求,用户可能需要自己实现一些数据结构,这时候就需要使用 Redis 的模块开发...

    1 年前
  • RxJS 操作符 - 多播操作符 publish、refCount 和 share

    RxJS 是一个流式编程库,它提供了许多操作符来处理流中的数据。其中,有一类特殊的操作符被称为多播操作符,它们可以将源 Observable 转换成一个多订阅的 Observable,从而让多个订阅者...

    1 年前
  • 如何在 Flexbox 布局中使用 calc() 函数

    Flexbox 是一种强大的 CSS 布局方式,它可以让我们更轻松地控制页面的布局和排列方式。而使用 calc() 函数则可以在 Flexbox 布局中更精确地控制元素的尺寸和位置。

    1 年前
  • 论 web 项目中的 CSS Reset

    背景 在网页开发中,CSS 是不可或缺的一部分。然而,每个浏览器的默认样式不同,导致网页在不同浏览器上显示效果往往不尽相同,这对网站的美观度和用户体验有很大影响。因此,为了让网页能够更好的呈现出所期望...

    1 年前
  • # 使用 ES12 中的 String.prototype.replaceAll() 解决 replace() 性能下降的问题

    使用 ES12 中的 String.prototype.replaceAll() 解决 replace() 性能下降的问题 在前端开发中,我们经常需要对字符串进行替换操作。

    1 年前
  • 在使用 Enzyme 测试 React 组件时如何模拟文本输入?

    在使用 Enzyme 测试 React 组件时如何模拟文本输入? 在进行 React 组件测试时,我们常常需要模拟用户输入,以测试组件的交互行为和响应能力。但是,如何在 Enzyme 中模拟文本输入呢...

    1 年前
  • Babel 编译了 ES6 代码,为什么还要手写 Polyfill?

    什么是 Babel Babel 是一款流行的 JavaScript 编译器,它可以把最新版的 JavaScript 代码转成可以运行在现代浏览器上的旧版 JavaScript 代码。

    1 年前
  • MongoDB 数据迁移实战经验分享

    MongoDB 是一种非关系型数据库,因其灵活的数据模型、高并发性能而备受前端开发者的青睐。但是,随着数据量的不断增加,我们可能需要将 MongoDB 数据进行迁移,以整合和优化数据、实现数据备份和还...

    1 年前
  • PM2 应用部署:如何应对进程重启时的数据丢失

    前言 在进行前端应用部署时,我们经常会使用 PM2 来进行进程管理。PM2 不仅可以帮助我们轻松地启动和停止进程,还可以自动监控进程的运行状态,并在进程异常退出时自动重启进程。

    1 年前
  • Node.js 中如何在 Linux 服务器上部署 Node.js 应用

    Node.js 中如何在 Linux 服务器上部署 Node.js 应用 随着越来越多的 Web 应用向前端趋近,Node.js 已经成为前端开发人员中一种非常流行的技术栈,并且也逐渐成为后端开发人员...

    1 年前
  • ES8 中的 Object.getOwnPropertyDescriptors() 方法实现深拷贝

    深拷贝是一种非常重要的编程技巧,它可以在将一个 JavaScript 对象复制到另一个对象时,确保复制的内容是完整的。ES8 中的 Object.getOwnPropertyDescriptors()...

    1 年前
  • 如何从 Hybrid App 迁移至 PWA 应用?

    随着 Web 技术的快速发展, Progressive Web App (PWA) 成为了 Web 应用开发的一种新模式。相比于传统的 Hybrid App,PWA 具有更好的性能、更大的灵活性和更低...

    1 年前
  • 移动端响应式设计中禁用图片缩放的技巧

    在移动端响应式设计中,我们通常会使用图片进行布局和装饰。但是,由于移动设备的屏幕尺寸和分辨率相对较小,为了让页面看起来更美观,很多网站会让图片自动缩放适应屏幕大小。

    1 年前
  • 如何在 Jest 中使用 Webpack 打包器

    在前端自动化测试领域,Jest 是一个备受推崇的框架,它能够提供全面的测试能力,包括单元测试、集成测试和端到端测试。然而,对于需要打包器来处理模块化代码的项目,Jest 并不会自动集成 Webpack...

    1 年前
  • 构建 Serverless 应用程序之前需要掌握的知识

    随着云计算的发展,Serverless 架构成为了越来越流行的选择。相比于传统架构,Serverless 架构具有更好的弹性和可扩展性,更少的管理负担,并且更易于编写和维护。

    1 年前
  • 利用 Material Design 的 TextInputLayout 实现输入框动画效果

    Material Design 是 Google 推出的一种设计语言,它被广泛应用于 Android 和 Web 开发中。其中,TextInputLayout 是 Material Design 中的...

    1 年前

相关推荐

    暂无文章