使用 Hapi.js 和 JSON Web Tokens 保证 API 安全

近年来,RESTful API 的使用越来越普遍,这种机制使得不同的系统之间可以相互交互,并实现数据的共享。但是,同时也带来了数据保密性和安全性的问题。为了解决这个问题,我们可以使用 JSON Web Tokens (JWTs) 和 Hapi.js 来保障 API 的安全性。

什么是 JSON Web Tokens (JWTs)

在深入了解 JWTs 之前,我们需要先了解一下什么是 token。在 Web 应用程序中,为了表示用户权限和识别用户数据,通常需要在用户登录后给出一个 token,然后把这个 token 附加到每个后来的请求中。在需要用户数据的地方,服务器可以根据这个 token 来验证用户的身份和权限。

JWTs 是另一种 token,但相比传统的 token,它们具有以下优点:

  • 可以自包含所有的用户信息
  • 可以签名、加密和解密
  • 可以被用于安全的分布式系统认证

因此,除了在 web 应用程序中使用外,JWTs 在移动应用程序和 IoT 设备等地方也非常有用。

JSON Web Tokens(JWTs)是一种开放标准(RFC 7519),它定义了各个方面的声明在 JSON 格式中。这些信息可以被签名和/或加密后作为 token 传递,以确定其身份信息和所需访问的资源。

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

使用 Hapi.js 和 JSON Web Tokens

下面我们将介绍如何使用 Hapi.js 和 JSON Web Tokens 来保护 API。

安装相关依赖

我们将使用 npm 包管理工具来安装必要的库。我们需要的依赖如下:

  • hapi:Hapi 框架
  • hapi-auth-jwt2:用于 JWT 身份验证
  • jsonwebtoken:JWT 的生成实用程序

运行以下命令来安装上述依赖:

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

实现 JWT 签名和验证

我们开始实现签名和验证 JWTs。首先创建一个名为 jwt.js 的文件来实现这个功能,代码实现如下:

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

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

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

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

如上代码,我们首先引入了必要的库,然后定义了一个密钥(即 secret)。在 issueToken 方法中,我们使用 jwt 包的 sign() 方法来生成基于输入数据(即 payload)和密钥的 JWT。在这里,我们还为 JWT 指定了一个有效时间(expiresIn)。否则,JWTs 将永远有效。

另一方面,在 verifyToken 方法中,我们使用 jwt 包的 verify() 方法来验证传入的 JWT。如果 JWT 有效,将返回解码的数据,否则将返回 false

创建一个 Hapi.js 服务器

下一步是创建一个 Hapi.js 服务器,并实现 JWT 的身份验证。下面是基本的启动文件 index.js

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

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

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

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

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

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

-------

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

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

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

如上代码,我们首先引入了必要的包和刚刚我们写的 JWT 签名和验证模块。然后我们创建了一个 Hapi.js 服务器,并通过调用 server.register() 方法来注册 hapi-auth-jwt2 插件。

下一步我们实现基于 JWT 的身份验证方式。使用 server.auth.strategy() 方法来定义我们的验证策略。在这里我们指定了密钥(yourSecretKey)和解码验证选项(verifyOptions)。我们还实现了一个 validate 方法来验证解码后的 JWT 是否有效。

最后,我们定义了两个路由,第一个不需要 JWT 验证,而第二个需要进行验证。如果 JWTs 验证通过,则返回 JWT protected,否则返回 401 Unauthorized

测试

运行 node index.js 命令来启动本地服务器,访问 http://localhost:3000/ 能够返回 hello world!,而访问 http://localhost:3000/protected 则会返回 401 Unauthorized

下面我们通过 Postman 工具来测试有身份验证的 API:

  1. 先打开 Postman,然后在 Headers 中添加 Content-Type: application/jsonAuthorization: Bearer <token>。其中 <token> 是我们使用生成 JWT 的签名代码生成的 token。
  2. 然后在 Postman 上点击 “Send” 按钮,我们就能够成功的访问到受到保护的 API 接口。

这里我们提供一个生成 JWT 的样例代码供参考:

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

这将返回一个 JWT,可以将其附加到后续的请求中(作为 Authorization 头的值)来进行验证。

总结

JSON Web Tokens 具有自包含、可签名和可加密的优点,使其在分布式系统中的身份验证非常有用。本文介绍了如何使用 Hapi.js 和 JSON Web Tokens 实现基于 JWT 的身份验证。我们通过刚刚提到的 jwt.js 文件模块和测试用例,详细说明了如何签名和验证 JWT,同时也提供了一个完整示例代码供大家参考。在实际开发中,需要根据实际情况进行修改,比如密钥长度、过期时间等。

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


猜你喜欢

  • 在 Bootstrap 和 Tailwind 之间做出正确的选择

    众所周知,Bootstrap 和 Tailwind 都是前端类的 UI 框架,具有巨大的用户群体和广泛的应用范围。但是,对于初学者来说,选择适合自己的框架时往往会犯一些错误。

    1 年前
  • 如何使用 CSS Grid 实现圣杯布局?

    CSS Grid 是最新的一种布局方式,它为前端开发者提供了更加灵活和强大的布局能力。圣杯布局也是前端开发中难度较高的一种布局方式,但是使用 CSS Grid 可以更加方便地实现这种布局。

    1 年前
  • SASS 的函数库:Bourbon 的使用方法和注意事项

    在前端开发中,CSS 是我们经常需要编写的一种语言。而 SASS 是一个非常流行的 CSS 预处理器,它可以大大简化我们的样式表代码,提高我们的开发效率。 Bourbon 是 SASS 的一个函数库,...

    1 年前
  • Sequelize 数据迁移的步骤详解

    Sequelize 是一个 Node.js 的 ORM(Object-Relational Mapping)框架,可以方便地操作数据库。数据迁移是一个重要的技术,它可以方便地将现有的数据库结构转移到新...

    1 年前
  • Redux 中的性能优化技巧

    Redux 是一种流行的状态管理库,广泛应用于 React 应用程序中。它是一种可靠、可扩展的架构模式,能够简化应用程序的状态管理。虽然 Redux 提供了许多有用的功能,但是随着应用程序规模的扩大,...

    1 年前
  • 如何利用 ES8 的 async/await 实现多个 promise 同时并发执行

    随着前端技术的发展,异步编程已成为前端开发中不可避免的部分,而 Promise 是异步编程中常见的解决方案之一。ES8(也称为 ECMAScript 2017)引入了 async/await 这一语言...

    1 年前
  • ECMAScript 2021 中的新模板字面量功能:让模板更精简

    随着前端技术的不断发展,JavaScript 也在不断的更新迭代,并添加新的功能和语法,让开发者能够更加高效地进行开发。在 ECMAScript 2021 中,引入了新的模板字面量(Template ...

    1 年前
  • 如何在 Jest 中使用 Mock 函数进行测试

    Mock 函数是一种在测试中非常有用的工具,它可以模拟出一个函数的行为,以便于测试代码。在前端开发中,我们经常会遇到需要模拟函数行为的情况。如何在 Jest 中使用 Mock 函数进行测试呢?本文将为...

    1 年前
  • Mocha 测试用例中的多个连接

    Mocha 是一个广受欢迎的 JavaScript 测试框架,它支持浏览器和 Node.js 环境下的测试。在编写测试用例时,我们经常需要与多个数据源或服务进行交互。

    1 年前
  • 你可能不知道的 Top Level await 妙用

    随着 JavaScript 语言版本的不断升级,新的特性和语法不断涌现。其中,ES2018 引入的 Top Level await 是一个许多人可能不熟悉的特性,但是它却有着许多妙用。

    1 年前
  • Angular 中使用 ng-include 指令的实际应用场景

    在 Angular 应用程序中,有时候我们需要在多个页面或组件中使用相同的 HTML 代码或模板。为了避免重复编写代码,我们可以使用 ng-include 指令将这部分代码提取到单独的文件中,并将它们...

    1 年前
  • Express.js 中使用 Node-Inspector 进行调试

    在前端开发中,常常会遇到需要对后端服务器进行调试的情况。Node.js 作为一种流行的后端开发语言,提供了许多调试工具来帮助开发人员快速诊断并解决问题。其中,Node-Inspector 是一种基于 ...

    1 年前
  • Docker Compose 详解

    在前端开发中,我们经常需要构建和部署复杂的应用程序。为了简化这个过程,Docker Compose 是一个非常有用的工具。它可以帮助我们定义和运行多个 Docker 容器,使我们能够轻松地创建、部署和...

    1 年前
  • Babel 在 Egg.js 中的集成配置详解

    前言 随着前端技术的不断发展,现在的前端开发已经不再是简单的编写 HTML、CSS、JavaScript 代码,随之而来的是一系列复杂的开发环境和工具链。其中,Babel 可以说是前端开发中必不可少的...

    1 年前
  • CSS Flexbox 实现选择框的样式

    CSS Flexbox是一种流行的CSS布局技术。它可以使开发人员更轻松地实现网页布局和网站设计。在本文中,我们将介绍如何使用CSS Flexbox来实现选择框的样式。

    1 年前
  • 如何优化.NET 应用程序的性能

    如何优化.NET 应用程序的性能 作为前端开发人员,我们经常需要优化应用程序的性能,以提高网站的访问速度和用户体验。在.NET应用程序中,我们可以采取以下措施来优化性能。

    1 年前
  • Koa.js 中 WebSocket 的断线重连问题解决方案

    前言 WebSocket 是一种在 Web 应用程序中开发实时通信的协议,它通过一个持久化的连接提供数据的双向传输。Koa.js 是一种基于 Node.js 的 Web 应用程序框架,它提供了一些中间...

    1 年前
  • Redis 如何解决集群环境下的数据丢失问题?

    随着互联网的发展,数据量越来越大,对数据的高并发访问需求也越来越高。这使得分布式系统逐渐成为主流,而 Redis 作为分布式缓存系统,也在分布式领域发挥着重要作用。

    1 年前
  • TypeScript 中的元组类型:从初探到实践

    TypeScript 是一个开源的静态类型检查器,它可以让 JavaScript 更加安全和健壮。在 TypeScript 中,元组类型是一个非常重要的概念,它可以让你在编写代码的时候更容易的处理像一...

    1 年前
  • Socket.IO 的优缺点、使用场景及技术优化

    Socket.IO 是一个可以让浏览器与服务器建立实时、双向通信的 JavaScript 库。它提供了极其简单易用的 API,同时支持诸如 WebSocket、轮询等多种传输协议,因此广受前端开发者欢...

    1 年前

相关推荐

    暂无文章