使用 Fastify 和 JSON Web Token 进行用户认证

阅读时长 11 分钟读完

在 Web 应用中,用户认证是一个至关重要的功能。它用于确定用户的身份以及授权用户访问受保护的资源。在本文中,我们将介绍如何使用 Fastify 和 JSON Web Token 进行用户认证。

什么是 Fastify?

Fastify 是一个快速、低开销、且高效的 Web 框架,其中内置了路由、中间件、输入验证等功能。它支持异步请求处理,并且具有出色的性能表现。

什么是 JSON Web Token(JWT)?

JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它通常用于身份认证和授权。JWT 包含一些声明(键值对),这些声明用于描述身份信息和其他元数据。JWT 使用签名来验证发送方和接收方之间的完整性,并且可以加密以实现保密性。

实现用户认证

在进行用户认证之前,我们需要创建一个用户数据库。我们可以使用 MongoDBPostgreSQL 或其他任何我们喜欢的数据库。在本文中,我们使用 MongoDB。

首先,我们需要安装所需的依赖项:

在我们的项目中,我们需要使用以下依赖项:

  • fastify - 快速且高效的 Web 框架
  • fastify-jwt - 用于 JSON Web Tokens 的 Fastify 插件
  • fastify-cors - Fastify 插件,用于启用跨域资源共享(CORS)
  • fastify-mongodb - Fastify 插件,用于集成 MongoDB 数据库

接下来,我们需要创建 Fastify 应用程序的实例,并将所需的插件注册到应用程序中:

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

-----------------------------------------
---------------------------------------- -
  ------- ---------------    -- --- ----
  ----- -
    ---------- ----          -- --- ----
  -
--
-------------------------------------------- -
  ---- --------------------------------
--
展开代码

在这里,我们注册了 fastify-corsfastify-jwtfastify-mongodb 插件,并传递了所需的选项。

接下来,我们可以创建一个 users 路由用于处理用户的注册和登录:

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

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

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

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

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

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

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

  -- ------------ --- ---------
  ----- ----- - ------------------ ----- --
  ------------ ----- --
--
展开代码

上述代码中,我们使用 /register 路由注册新用户,并将其存储在 users 集合中。在 /login 路由中,我们首先在 users 集合中查找用户。如果用户不存在或密码不正确,则发送错误响应。否则,我们生成一个 JWT,并将其发送给客户端。

验证 JWT

一旦用户成功登录并收到 JWT,我们需要在后续请求中验证 JWT。为此,我们可以编写一个 Fastify 中间件,用于验证 JWT:

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

----------------------------- -------------------------------------
展开代码

在这里,我们向 Fastify 应用程序添加了一个名为 authenticate 的装饰器。该装饰器检查请求头中是否存在有效的 JWT。如果 JWT 无效,则向客户端发送错误响应。

接下来,我们在 Fastify 应用程序的钩子函数中添加了 preHandler 钩子。此钩子用于验证 JWT,以确保其所有保护的路由都受到保护。

保护路由

现在,我们已经完成了用户认证的实现,现在我们需要将我们的路由保护起来,以确保只有经过身份验证的用户才能访问受保护的资源。为此,我们需要使用 fastify.decorate 来向 Fastify 应用程序添加受保护的路由:

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

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

    -- ----
    ------------ -------- ------ ------ --
  -
--
展开代码

在上面的代码中,我们使用 fastify.decorate 添加了 isAdmin 功能。此功能指示是否有权访问受保护的路由。然后,我们通过 fastify.route 向 Fastify 应用程序添加了 /protected 路由,并使用 fastify.authenticate 中间件保护了该路由。在处理该路由时,我们检查当前用户是否拥有管理员权限。如果不是,则向客户端发送错误响应;否则,我们继续处理请求并向客户端发送响应。

示例代码

下面是一个使用 Fastify 和 JSON Web Token 进行用户认证的完整示例代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  ------------------------ --------- -- ----------------------------------
--
展开代码

总结

通过使用 Fastify 和 JSON Web Token,我们可以轻松地实现用户认证。在本文中,我们创建了一个 Fastify 应用程序,并向其添加了插件和中间件以处理用户注册、登录和 JWT 验证。我们还保护了受保护的路由,并检查当前用户是否为管理员。同时,我们还提供了一个完整的示例代码,帮助您更轻松地理解如何使用 Fastify 和 JSON Web Token 进行用户认证。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6499944248841e9894697b49

纠错
反馈

纠错反馈

程序员教程

精选优质教程,助你快速提升技术实力

程序员面试题库

海量优质面试题,助你轻松应对技术面试