如何在 Next.js 中实现用户认证?

Next.js 是一个流行的 React 框架,可帮助我们构建 SSR(服务器端渲染)应用程序。使用 Next.js 的一个好处是它可以帮助我们更好地管理用户认证。在本文中,我们将介绍如何在 Next.js 中实现用户认证。

什么是用户认证?

用户认证是识别用户身份的过程。验证用户身份后,用户可以获得访问资源的权限。这可以是一些隐私内容,比如用户的个人资料,也可以是像发表评论、文章或购物的功能等应用程序的其他功能。

实现用户认证的基本原则

在实现用户认证之前,需要遵循以下原则。

1. 用户名和密码应该被加密

不要在服务器或客户端中存储明文密码。存储的密码应该使用哈希函数加密,并保存哈希码。

2. 实现多层认证

有时候,用户名和密码认证可能不够安全。例如,如果一个攻击者知道你的用户名和密码,或者如果你的密码太弱,例如只有六位数或者是常见的字典中出现的单词,那么攻击者可能会使用密码破解工具来尝试破解你的密码。单层认证可能不足以预防这些攻击。在这种情况下,建议使用多层认证。

在多层认证中,除了用户名和密码认证外,还可以使用身份证件、指纹、面部识别等技术。

3. 会话管理

会话管理是指如何“记住”某个用户已经通过认证,以便他们在下次访问时无需重新通过认证。对于 Web 应用程序,通常使用 cookie 进行会话管理,但这不是坚固的方法,因为 Web 应用程序中的 cookie 容易受到 CSRF 攻击。

实现用户认证

使用 Next.js 实现用户认证需要完成以下几个步骤。

1. 在前端实现登录和注册

使用 Next.js,我们可以在前端实现登录和注册表单。例如:

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

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

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

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

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

2. 创建 API 路由

接下来,我们需要为登录和注册创建 API 路由。我们可以在 pages/api 目录下创建一个名为 login.js 和 register.js 的文件。例如,假设我们使用 Apollo GraphQL 来管理用户数据,则 login.js 文件可以像这样:

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

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

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

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

3. 在后端中优化会话

使用.env文件可以将我们的服务连接到一个有效的数据库中,并使用许多已经存在的额外功能。首先,我们需要在.env文件中添加以下行:

-------------------------------------------------
--------------------
  • DB_CONNECT:数据库连接字符串,可以是本地 MongoDB 实例。
  • JWT_SECRET:用于签名 JSON Web Tokens(JWT)的密钥。需要为每个 Next.js 应用程序生成一个唯一的密钥。

我们可以使用第三方库 jsonwebtoken 来生成 jwt tokens。具体来说,我们可以在 pages/api/login.js 中实现它:

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

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

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

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

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

这段代码生成一个带有过期时间为一小时的 JWT 并设置一个 HttpOnly cookie。这将确保 jwt 仅在服务器可用,从而更难以被 CSRF 攻击攻破。

4. 在需要身份验证的页面中验证用户

Next.js 提供了一个名为 getServerSideProps 的函数。这个函数允许我们在每次页面加载时从服务器端检索数据。我们可以使用此功能来检查用户的身份。首先,我们可以创建一个名为 /login 的页面,该页面充当登录表单的输入点。在获取表单输入时,我们将使用服务器端 getServerSideProps 函数来检查用户是否已登录:

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

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

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

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

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

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

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

5. 结论

在本文中,我们介绍了在 Next.js 中实现用户认证的基本原则,并提供了一个用于实现用户认证的步骤和示例代码。实现良好的用户验证是构建现代 Web 应用的关键。希望这篇文章能帮助您了解如何使用 Next.js 管理身份验证和保护应用程序。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66fce3534471362601744912