Hapi.js 实现 JWT 登录认证及相关的技术细节

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

前言

随着 Web 应用程序复杂度的增加,用户身份验证是一个必不可少的功能。在 Node.js 的生态系统中,Hapi.js 是一个功能强大、可扩展的 Node.js Web 应用程序框架,它提供了很多有用的插件和工具来帮助开发者快速、高效地构建 Web 应用程序。其中,登录认证是一个常见的需求,然而 Hapi.js 本身并不提供这个功能。在此文章中,我们会探讨如何使用 Hapi.js 和 JSON Web Token(JWT)来实现登录认证功能。

什么是 JWT

JSON Web Token(JWT)是一种开放标准,定义了一种用于在网络上传输信息的紧凑、自我描述、安全的方式。它可以在发送方和接收方之间传递用户身份认证信息,以便在服务端作出授权决策。

一个 JWT 包含三个部分:头部(header)、载荷(payload)和签名(signature),它们用点号(.)分隔开来。JWT 的一个示例如下:

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

其中,头部声明了所使用的算法和 token 类型,载荷包含 JWT 的声明信息和实际使用的数据,例如用户 ID、权限等信息,签名则是使用头部中声明的算法对头部和载荷进行数字签名后生成的字符串,用于验证 token 的有效性。

Hapi.js 实现 JWT 登录认证

接下来我们来讨论如何在 Hapi.js 中实现 JWT 登录认证。

安装依赖

首先,我们需要安装一些必须的依赖:

--- ------- ---------- ---------- --------- ---------- -------------- -------- ------------
  • @hapi/hapi:Hapi.js 框架;
  • @hapi/boom:HTTP 错误包装器;
  • @hapi/joi:数据验证库;
  • @hapi/glue:将配置和组件粘合在一起的工具;
  • hapi-auth-jwt2:Hapi.js JWT 认证插件;
  • mongoose:MongoDB 的 ODM;
  • jsonwebtoken:使用 JWT 生成和验证 token。

配置服务器

首先,我们需要配置 Hapi.js 服务器。代码如下:

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

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

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

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

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

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

我们在这里使用了 @hapi/glue 模块来将配置和组件粘合在一起。我们将配置放在了 manifest 中,指定了服务器的端口和插件等信息。在这个配置中,我们注册了一个叫做 ./plugins/routes 的插件,在接下来的代码中会提到。

编写认证策略

接下来,我们需要在 Hapi.js 中编写 JWT 认证策略。认证策略可以用来指定特定的用户认证标准,例如用户需要设置密码,或者已登录。我们在这里使用 JWT 为用户进行认证。代码如下:

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

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

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

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

首先,我们指定了一个JWT_SECRET变量,它将被用来创建和验证 token。需要注意的是,这个变量在生产环境中应该配置在环境变量中。

接下来,我们注册了 hapi-auth-jwt2 插件,并创建了一个叫做 'jwt' 的认证策略。在这个策略中,我们使用了 validate 回调函数进行用户数据验证。在这里,我们使用了 Mongoose ODM 来做验证,首先我们从 token 的有效载荷中获取用户 ID,并使用这个 ID 从 MongoDB 数据库中找到对应的用户。如果用户不存在,那么该 token 是无效的。

最后,我们设置了默认的认证策略为 'jwt'。这样,如果用户未通过认证,那么将无法访问受保护的路由。

登录路由

我们需要为应用程序添加一个路由,以便用户能够通过登录页面进行认证。在这里,我们将使用 jsonwebtoken 包生成 token 并将其保存在用户的浏览器中。代码如下:

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

首先,我们定义了一个路由,该路由在 'POST /login' 地址上监听请求。这个路由不需要进行身份验证,所以我们将 auth 设置为 false。该路由的 payload 将包含 email 和 password 字段,并且它们都是必填字段(由 Joi.string().email().required()Joi.string().min(6).required() 规定)。如果任何一个字段无法通过验证,则将引发429TooMany Requests HTTP响应。我们在这里使用的是 Hapi.js 的默认策略。如果您需要进一步自定义验证失败时的行为,请参阅 Hapi.js 文档。

在路由的主体中,我们首先从请求的载荷中取出 email 和 password 字段,并从 MongoDB 数据库中查找具有相应 email 值的用户。如果找不到用户,那么我们使用 Boom.unauthorized 静态函数返回 401 Unauthorized HTTP 响应。

接下来,我们使用 User 模型中的 isValidPassword 方法来验证用户的密码是否匹配。如果密码不匹配,那么我们将返回 401 Unauthorized HTTP 响应。否则,我们将使用 jsonwebtoken 包生成 token 并将其返回给用户。token 应该储存在用户的浏览器中,客户端可以在每个后续请求中将其发送回服务器进行身份验证。

受保护的路由

最后,我们需要创建一些需要用户身份验证的受保护的路由。代码如下:

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

在这里,我们定义了一个需要进行身份验证的路由。这个路由在 'GET /me' 地址上监听请求,当用户尝试访问该路由时,Hapi.js将使用 'jwt' 认证策略进行身份验证。如果用户未通过身份验证,那么将返回 401 Unauthorized HTTP 响应。

如果用户通过了身份验证,那么我们从 request.auth.credentials 中获取用户 ID,并将其传递给 User.findById 来查找用户。如果找不到用户,那么我们将返回 401 Unauthorized HTTP 响应。否则,我们将返回用户的详细信息。

结论

本文讨论了在 Hapi.js 中实现 JWT 登录认证功能的详细步骤。首先,我们介绍了 JWT 的基础知识,以及它如何用于在网络上传输安全信息。接下来,我们介绍了如何在 Hapi.js 中实现 JWT 认证策略,以及如何编写登录路由和需要身份验证的受保护路由。通过本文的指导,我们可以为 Web 应用程序添加 JWT 身份验证功能,并保证其获得更高的安全性和可扩展性。

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


猜你喜欢

  • React Native 中的生命周期方法指南

    React Native 是 Facebook 开源的一个框架,用于构建跨平台移动应用程序。React Native 采用了基于组件的设计模式,其组件可以定义一些生命周期方法来管理组件的状态和行为。

    18 天前
  • Express.js 应用程序的缓存控制和静态资源管理

    Express.js 是一个基于 Node.js 平台的极简、灵活的 Web 应用程序框架,在前端开发中得到广泛应用。本文将介绍在 Express.js 应用程序中如何进行缓存控制和静态资源管理。

    18 天前
  • React + Redux + React Router 集成总结

    React、Redux 和 React Router 是前端开发中非常流行的技术栈。React 作为一个高效的 UI 框架,Redux 作为状态管理库,而 React Router 则是使用 Reac...

    18 天前
  • PWA 的实际应用 —— 篇一

    近年来,PWA 技术越来越受到前端开发者的关注。PWA(Progressive Web App,渐进式 Web 应用)是一种利用 Web 技术开发的符合 PWA 标准的 Web 应用,具有类似原生 A...

    18 天前
  • Cypress 实现网页性能测试的最佳实践和优化技巧

    Cypress 实现网页性能测试的最佳实践和优化技巧 随着互联网的发展,网页性能已经成为了一个非常重要的指标。一些糟糕的网站性能会影响用户的体验,甚至会影响业务的运转。

    18 天前
  • 如何在 Koa2 中使用 WebSocket 实现实时聊天

    随着互联网技术的发展,实时通信在 web 应用中变得越来越重要。实时通信指用户之间的交流,比如聊天、游戏等,这些场景需要实时性较高且消息的传输不可靠,因此需要使用 WebSocket 技术来实现。

    18 天前
  • 如何使用 Hapi 和 Boom 实现 RESTful API 的错误处理

    RESTful API 经常会被开发者用来构建前端应用,因为它可以提供简单、可伸缩的接口,但是当出现错误时,必须要有很好的错误处理机制。在本文中,我们将学习如何使用 Hapi 和 Boom 库来实现 ...

    18 天前
  • Node.js 中的异常处理

    作为一名前端开发人员,在 Node.js 中,异常处理是一项十分重要的技能。Node.js 中的异常处理不仅可以帮助开发人员更好地监控应用程序的健康状况,同时也可以提高代码质量和开发效率。

    18 天前
  • 在 Node.js 中使用 TypeScript 的指南

    TypeScript 是一种强类型的 JavaScript 超集语言,它支持静态类型检查和更好的代码提示,并且能够将 TypeScript 编译成纯 JavaScript 代码以在浏览器中运行。

    18 天前
  • Node.js 中的 Promise 如何使用和处理错误

    简介 在 Node.js 中,Promise 是一种流行的异步编程机制,它可以帮助开发人员更有效地管理异步操作。Promise 提供了一种优雅的方式来组织和处理异步代码,消除了传统的回调嵌套问题。

    18 天前
  • 详解如何在网页中使用 LESS

    前言 LESS 是一种 CSS 预处理器,它能够让 CSS 代码更加优雅和易于管理。相比于原始 CSS,LESS 提供了一些更强大和灵活的语言特性,如变量,函数和嵌套规则等。

    18 天前
  • 在 Jest 中使用 DOM 测试

    什么是 Jest? Jest 是一个由 Facebook 开发的 JavaScript 测试框架,用于编写自动化测试和快照测试。它易于配置、易于使用,并集成了断言库、mock 库和代码覆盖率报告工具,...

    18 天前
  • 使用 GraphQL 创建可扩展的 WebHook 服务

    WebHook 服务是一种使网站、应用和服务之间自动同步的方法。使用 WebHook,当一个特定事件发生时,如发表文章或创建新用户,会自动向另一个应用程序发送 HTTP 请求,通常会包含 JSON 格...

    18 天前
  • ES11-null 性合并操作符和数字互操作性

    ES11-null 合并操作符和数字互操作性 在 ES11 中,一个令人兴奋的新特性是 null 合并操作符(??)。此操作符可以用来处理变量为 null 或 undefined 的情况。

    18 天前
  • 前端类技术文章:支持无障碍功能,让使用体验更优秀

    作为一名前端开发者,我们要始终关注用户体验,特别是那些使用辅助设备的用户。支持无障碍功能,可以让这部分用户也能方便地使用我们的应用程序,这对于用户体验是极其重要的。

    18 天前
  • React Native 中的 Fetch API 教程

    React Native 提供了一个名为 Fetch API 的网络请求服务,可用于获取和发送数据。Fetch API 具有良好的浏览器兼容性,并且是一种功能强大的基于 Promise 的 API,使...

    18 天前
  • 在 Koa 应用程序中使用 Mocha 和 Chai 进行端到端测试

    测试是任何应用程序开发人员的核心工作之一。端到端测试是测试应用程序的最终阶段,以确保应用程序按照预期工作。 在本文中,我将向您介绍如何使用 Mocha 和 Chai 测试框架来编写有效的端到端测试。

    18 天前
  • 使用 PM2 部署多个 Node.js 应用的经验

    在当今互联网发展的快速背景下,Node.js成为了前端领域的不可或缺的一部分,特别是在实时性和高并发需求较高的领域,如Web应用程序、REST APIs、websocket服务、实时数据更新等,Nod...

    18 天前
  • Headless CMS 是否适合敏捷开发流程?

    随着Web应用程序和移动应用程序领域的发展,前端开发人员们需要更加高效和敏捷地工作。在这种情况下,Headless CMS应运而生。Headless CMS是一种新兴的CMS类型,它与传统CMS有所不...

    18 天前
  • MongoDB 容灾备份的实现方法

    在进行数据存储时,备份与容灾是非常重要的步骤。在 MongoDB 中,也需要进行数据的备份与容灾,以确保数据的安全性。本文将详细介绍 MongoDB 的容灾备份实现方法。

    18 天前

相关推荐

    暂无文章