利用 Express.js 实现用户认证和授权

阅读时长 10 分钟读完

在 Web 应用程序中,用户认证和授权是非常重要的功能。用户认证是指验证用户身份,以确保他们有权访问应用程序的特定部分。授权是指确定用户有权访问哪些资源。

Express.js 是一种流行的 Node.js 框架,它可以帮助我们快速构建 Web 应用程序。在本文中,我们将探讨如何使用 Express.js 实现用户认证和授权。

用户认证

用户认证是一个多步骤的过程。我们需要验证用户提供的凭据,以确保他们是合法的用户。凭据可以是用户名和密码、电子邮件和密码、或其他任何标识符。我们将使用 Passport.js 来管理用户认证。

安装 Passport.js

首先,我们需要安装 Passport.js 和相关的模块:

这些模块包括:

  • passport:认证中间件
  • passport-local:本地策略,用于验证用户名和密码
  • passport-jwt:JSON Web Token(JWT)策略,用于验证用户的 JWT
  • bcryptjs:密码哈希库,用于加密和解密密码
  • jsonwebtoken:JWT 库,用于创建和验证 JWT

配置 Passport.js

我们需要配置 Passport.js,以便它可以使用本地策略和 JWT 策略。我们将在 app.js 文件中进行配置。

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

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

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

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

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

这里我们定义了两个策略:

  • localStrategy:使用本地策略验证用户名和密码
  • jwtStrategy:使用 JWT 策略验证用户的 JWT

用户注册和登录

我们需要创建一个用户模型和一些路由来处理用户注册和登录。在这里,我们将使用 MongoDB 作为我们的数据库。

用户模型

我们将创建一个简单的用户模型,其中包含用户的电子邮件和密码哈希。

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

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

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

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

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

这里我们使用了 Mongoose,一个 Node.js 的 MongoDB 驱动程序。我们还使用了 bcryptjs,一个密码哈希库,用于加密和解密密码。

userSchema.pre('save') 钩子函数中,我们使用 bcryptjs 生成一个哈希值,并将其存储在数据库中。

用户注册

现在我们可以创建一个路由来处理用户注册。在这里,我们将使用 Express.js 中的 body-parser 中间件来解析请求正文中的 JSON 数据。

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

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

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

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

这里我们使用了 User 模型来创建一个新用户,并将其保存在数据库中。如果保存成功,我们将返回用户数据。

用户登录

现在我们可以创建一个路由来处理用户登录。在这里,我们将使用 Passport.js 来验证用户名和密码,并创建一个 JWT。

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

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

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

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

这里我们使用了 Passport.js 的 passport.authenticate() 方法来验证用户名和密码。如果验证成功,我们将创建一个 JWT,并将其返回给客户端。

用户授权

现在我们已经实现了用户认证,下一步是用户授权。我们需要确定哪些用户有权访问哪些资源。在这里,我们将使用 JSON Web Token(JWT)来管理用户授权。

配置 JWT

我们需要配置 JWT,以便它可以从请求头部中提取 JWT,并验证它是否有效。我们将在 app.js 文件中进行配置。

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

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

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

这里我们定义了一个 JWT 策略,并将其添加到 Passport.js 中。我们还指定了 JWT 的来源和密钥。

路由保护

现在我们可以创建一些需要授权才能访问的路由。在这里,我们将使用 passport.authenticate() 方法来验证 JWT。

这里我们使用了 passport.authenticate() 方法来验证 JWT。如果验证成功,我们将返回受保护的资源。

总结

在本文中,我们探讨了如何使用 Express.js 实现用户认证和授权。我们使用了 Passport.js 管理用户认证,并使用 JWT 管理用户授权。我们还创建了一些需要授权才能访问的路由,并保护了它们。这些技术可以帮助我们创建更安全、更可靠的 Web 应用程序。

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

纠错
反馈