如何在 Next.js 应用中使用 JWT 进行身份认证?

阅读时长 8 分钟读完

在现代 web 应用中,身份认证是一个不可缺少的功能。JWT(JSON Web Tokens)是一种常见的身份认证方式。在本文中,我们将探索如何在 Next.js 应用中使用 JWT 进行身份认证。

JWT 简介

JWT 是一种用于传输声明的简明安全传输协议,可以通过加密和签名来保护数据。在身份认证方案中,JWT 被用于生成和验证用户的凭证信息。JWT 由三部分组成:Header(头部)、Payload(负载)和 Signature(签名)。Header 包含算法和类型信息;Payload 包含需要传输的声明信息;Signature 使用密钥和头部信息生成,用于验证传输的信息是否被篡改。

创建一个 Next.js 应用

首先,我们需要创建一个 Next.js 应用。我们可以使用 create-next-app 命令来创建一个新的 Next.js 应用:

然后,我们可以进入 my-app 目录并启动应用:

现在我们有了一个运行在 http://localhost:3000 上的 Next.js 应用。

安装依赖包

接下来,我们需要安装一些依赖包:

我们使用 jsonwebtoken 来生成和验证 JWT,使用 cookie-parser 来处理 Cookie。

创建一个登录页面

我们需要一个登录页面来获取用户的凭证信息。在 pages 目录下创建一个名为 login.js 的文件,然后添加以下代码:

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

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

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

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

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

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

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

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

在这个页面中,我们使用 useState 来存储用户输入的邮箱和密码。在表单提交时,我们将这些信息发送到 /api/login 路由上,并等待响应。如果响应正常,我们将获取到的 JWT 存储在 Cookie 中,并将用户重定向到应用的主页。

创建一个认证 API

接下来,我们需要创建一个 Express 路由,用于验证用户凭证信息并生成 JWT。在应用的根目录中创建一个名为 api 的目录,然后在其中创建一个名为 login.js 的文件,添加以下代码:

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

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

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

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

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

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

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

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

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

在这个路由中,我们使用 getUserByEmail 函数来获取具有给定电子邮件的用户。如果找不到用户或密码不正确,则返回 401 状态码并包含错误消息。否则,我们签署 JWT 并将其返回到客户端。

创建一个保护页面

现在我们有了一个登录页面和可以用于验证用户凭证信息的 API。但是,我们希望在用户登录后只允许他们访问某些页面。为此,我们可以创建一个高阶组件来保护需要身份验证的页面。在 lib 目录中创建一个名为 withAuth.js 的文件,添加以下代码:

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

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

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

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

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

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

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

这个高阶组件将在页面加载时检查 Cookie 中是否包含 JWT。如果不包含,则用户将被重定向到登录页面。如果包含,则我们可以验证该 JWT 是否有效。在这个例子中,我们只是验证 JWT 是否可以解码,但是实际上我们可能会生成过期时间、标识符或其他声明,然后在验证时检查该声明。

在应用页面中使用身份认证

现在我们已经准备好了,可以在我们应用的页面中使用身份认证来限制对某些页面的访问。假设我们要保护一个名为 dashboard 的页面,我们可以在其中使用高阶组件:

现在,只有经过身份验证的用户才能访问 dashboard 页面。

结论

在本文中,我们了解了在 Next.js 应用中使用 JWT 进行身份认证的方法。在实际应用中,我们可能需要更复杂的方案,例如在客户端和服务器端进行身份验证,使用社交登录或 OAuth 2.0 等。但是,使用 JWT 对于许多 web 应用程序来说是一个灵活而强大的方案,可以轻松地实现许多基本的身份认证需求。

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

纠错
反馈