使用 Hapi.js 和 JWT 创建身份验证微服务

介绍

在现代应用程序中,安全是至关重要的。由于互联网时代大量用户账号的出现,为用户操作带来了风险。因此,身份验证是应用程序的核心部分之一。在本文中,我们将深入探讨如何使用 Hapi.js 和 JWT 创建身份验证微服务。

Hapi.js

Hapi.js 是一个流行的 Node.js Web 框架,它提供了一组工具和插件,来构建可扩展的 Web 应用程序。与其他 Web 框架不同,Hapi.js 的焦点并不仅在于 HTTP 路由,它更强调开发者友好性和可测试性。

JWT

JSON Web Token(JWT)是一种开放标准,它定义了一种紧凑、自包含的格式,用于在双方之间安全地传输信息。它通常用于身份验证和授权,因为它可以帮助我们识别请求的来源并对其进行授权。

如何使用 Hapi.js 和 JWT 来创建身份验证微服务

在本文中,我们将学习如何使用 Hapi.js 和 JWT 来创建身份验证微服务。此服务将由以下主要组件组成:

  • 数据库:此服务将使用 MongoDB 数据库。
  • Hapi.js:我们将使用此框架来构建此服务。
  • JWT:我们将使用此标准来创建和验证用户令牌。

以下是实现此服务的步骤:

安装和配置 Hapi.js

首先,我们需要安装 Hapi.js 及其相关插件:

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

然后,我们需要创建一个新项目并安装所需插件:

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

接下来,我们创建一个基本的 Hapi.js 应用程序,并在其中设置身份验证插件:

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

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

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

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

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

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

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

-------

这是一个简单的 Hapi.js 应用程序示例,其中定义了两个路由:一个公共路由和一个受保护路由。您可以通过访问 /protected 路由来验证身份验证插件是否正常工作。

添加 MongoDB 数据库支持

接下来,我们需要添加对 MongoDB 数据库的支持。为此,我们将使用 Mongoose,它是一个流行的 MongoDB ORM。首先,我们需要安装 mongoose:

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

然后,我们将设置和配置数据库:

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

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

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

在这个例子中,我们连接到名为 myapp 的 MongoDB 数据库。然后,我们定义 Users 模型以存储用户记录。

添加注册和登录路由

在此步骤中,我们将添加用于注册和登录用户的路由。这些路由将接收来自客户端的有效负载并对其进行验证和处理。对于此示例,我们将使用 @hapi/joi 库来验证请求的有效负载。

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个例子中,首先我们定义了路由 /register/login。 它们都将接收来自客户端的有效负载并对其进行验证。如果有效负载通过验证,则将保存或查找用户,并使用 bcrypt 加密和验证密码。

/register 路由中,我们根据输入有效负载创建新用户。同时,我们还检查是否存在具有相同电子邮件的用户。如果存在,我们将返回 Boom.badRequest,从而表示该请求不合法。

/login 路由中,我们将查找用户并验证其密码。最后,我们使用 jsonwebtoken 库生成并返回 JWT。

测试服务

我们现在可以通过执行以下命令来测试这个服务:

--- -----

我们可以通过访问 /register/login 路由来测试服务的身份验证功能。

例如,如果我们要注册新用户,则应该发出类似以下示例有效负载的 POST 请求:

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

如果请求有效,则应该返回以下响应:

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

如果我们要登录,则应发出类似以下示例有效负载的 POST 请求:

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

如果请求有效,则应该返回以下响应,其中包含我们生成的 JWT:

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

接下来,我们可以使用生成的 JWT 访问受保护的路由。例如,我们可以通过将 JWT 放在 Authorization 标头中并向 /protected 路由发送 GET 请求来测试此功能:

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

如果 JWT 是有效的,则应该返回以下响应:

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

否则,将返回 401 Unauthorized 响应。

结论

在本文中,我们学习了如何使用 Hapi.js 和 JWT 创建身份验证微服务。我们学习了如何:安装和配置 Hapi.js 框架、链接 MongoDB 数据库、验证和处理有效负载、加密和验证密码,并生成 JWT 以供身份验证使用。现在,您可以使用本文的指南和示例代码来创建您自己的身份验证微服务。

参考资料

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


猜你喜欢

  • RESTful API 设计指南:最佳实践

    RESTful API 是一种描述性的架构风格,它可以让 Web 服务与客户端之间进行自然协调,并便于扩展和重用。在本文中,我们将分享一些在实际开发中使用 RESTful API 的最佳实践,以帮助您...

    7 天前
  • SSE 连接闲置超时:后台服务解决方案

    在使用前端的 Server-Sent Events (简称 SSE)时,我们经常会面临一个问题:连接可能会因为长时间无数据而被关闭。这就是所谓的“连接闲置超时”问题。

    7 天前
  • 如何针对不同浏览器的响应式用户代理构建站点!

    前言 在世界范围内,有不同种类的浏览器,那么网站应该要怎么样才能在不同的浏览器中保持一致的样式和布局呢?在本篇文章中,我们将会探讨如何使用响应式用户代理来实现在不同的浏览器下保持风格的网站。

    7 天前
  • ES7 提供 Array.includes 方法的实践方法

    ES7 提供 Array.includes 方法的实践方法 在前端开发中,数组是一种非常重要的数据结构。而 ES7 中的 Array.includes 方法为我们提供了一种更加方便和快捷的方式来判断数...

    7 天前
  • TypeScript 中的重载

    在 TypeScript 中,函数的重载是一种非常强大的特性。通过函数重载,我们可以为同一个函数实现多种参数类型和返回值类型的情况,以适应不同的使用场景。 基本概念 函数重载是指,提供多个函数实现,根...

    7 天前
  • Kubernetes Pod 的生命周期:从 Pending 到 Running

    Kubernetes 是目前比较流行的容器编排平台,它提供了对容器的自动化部署、扩缩容等功能,管理多个容器的时候往往用的是 Pod。Pod 是 Kubernetes 中最小的部署单元,用于承载一个或多...

    7 天前
  • Custom Elements 如何使用 JavaScript 进行动态组件绑定

    在前端开发中,组件化是一个非常重要的概念。而 Custom Elements 可以帮助我们更好地实现组件化,让我们的代码更加模块化、可重用和易于维护。本文将介绍 Custom Elements 的基本...

    7 天前
  • Sequelize 中的错误处理:如何避免抛出异常

    Sequelize 是一个流行的 Node.js ORM (Object-Relational Mapping)框架,用于处理与关系型数据库的交互。在实际开发中,错误处理是不可避免的事情。

    7 天前
  • Fastify 应用程序中的单元测试详解

    作为一种轻量级且快速的 Web 框架,Fastify 在前端应用程序中越来越受欢迎。为了确保代码的可靠性和质量,开发者需要使用可靠的测试方式,其中单元测试是最常见的方法之一。

    7 天前
  • JS: BigInt 入门详解

    在日常前端开发中,我们经常需要进行各种计算操作,比如处理大数字,此时就需要使用 BigInt 类型。本文将为大家详细介绍 BigInt 类型的定义、应用场景以及相关注意事项,帮助读者更好地理解 Big...

    7 天前
  • Angular 中如何使用 NPM 包管理工具 npm 实现依赖管理

    Angular 中如何使用 NPM 包管理工具 npm 实现依赖管理 NPM 是 Node.js 的包管理工具,它可以帮助我们轻松地管理、安装和升级我们的前端 JavaScript 应用程序所需要的模...

    7 天前
  • Web Components 在 Cordova 等移动端框架中的应用方法

    Web Components 在 Cordova 等移动端框架中的应用方法 Web Components 是一种前端技术,它提供了一种组件化的开发模式。将一个组件视为一块独立的代码,可以在其他应用程序...

    7 天前
  • ECMAScript 2021 中的 Promise.allSettled() 方法:如何更好地处理异步任务

    ECMAScript 2021 中的 Promise.allSettled() 方法:如何更好地处理异步任务 随着前端技术的发展,我们越来越依赖异步编程来处理我们的应用程序。

    7 天前
  • Enzyme: React Native 组件测试的工具

    在 React Native 开发中,测试是不可避免的一环。组件测试是其中一个非常重要的部分,它可以确保您的应用程序在最初构建时的代码质量,从而减少代码错误的可能性。这就是 Enzyme 所做的事情。

    7 天前
  • 如何在 Mocha 测试中测试 Node.js 中的流(stream)

    在 Node.js 中,流(stream)是一种有效处理大量数据的实现方式。它们允许以逐块的方式读取和处理数据,而不需要一次性将整个数据集加载到内存中。 在前端领域中,Mocha 是一种流行的 Jav...

    7 天前
  • 在协作中使用 Koa.js 和 socket.io

    介绍 随着 Web 应用程序变得更加复杂和交互性,像 socket.io、Koa.js 这样的 JavaScript 库已经成为了前端界的常见工具。这篇文章主要介绍如何使用 Koa 和 socket....

    7 天前
  • 如何在 Deno 中使用 OAuth 进行用户认证

    在现代 Web 应用程序中,用户的身份认证变得非常重要。OAuth 协议被广泛使用来实现身份验证和授权。本文将介绍如何在 Deno 中使用 OAuth 进行用户身份认证。

    7 天前
  • 通过 ARIA 实现无障碍导航,开创更多可能

    Web 应用程序的无障碍性是现代前端开发中不可或缺的一部分。以前端开发者的角度来看,实现无障碍性可以为不同类型的用户创建更好的体验,提高其交互能力,实现更广泛的可访问性,从而增加使用量和用户忠诚度。

    7 天前
  • CSS Grid 布局与响应式图片

    在现代网站设计中,响应式布局和响应式图片已经成为了不可或缺的元素。CSS Grid 布局是一种强大的排版工具,可以为我们提供更好的响应式布局功能。本文将介绍如何使用 CSS Grid 布局实现响应式图...

    7 天前
  • Express.js 中开发高可用性 Web 应用的方法和技巧

    前言 在现代 Web 应用开发中,可用性是非常重要的因素之一。可用性是指用户能否顺利地使用应用,不会遇到意外的错误或中断。为了实现高可用性的 Web 应用,我们需要选择适合的框架,并且遵循一些开发规范...

    7 天前

相关推荐

    暂无文章