使用 Passport.js 和 Express.js 进行身份验证

介绍

在现代 Web 应用程序中,身份验证是至关重要的一个功能。它可以确保用户的安全,防止信息泄漏和攻击,同时也可以为应用程序提供更多的功能和用户体验。在前端实现身份验证非常常见,这需要一些工具和库来让它变得更加简单和可信。

Passport.js 是一个非常流行的 Node.js 应用程序中的验证库。它提供了不同的验证策略,例如本地验证、社交媒体验证等等。在本文中,我们将探讨如何使用 Passport.js 与 Express.js 结合实现身份验证。

注意:本文需要读者具有基本的 Node.js 和 Express.js 开发知识,如果你还不了解,请先学习相关知识。

安装 Passport.js

首先,让我们安装 Passport.js 库。在终端中执行以下命令:

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

此命令将在您的项目中安装 Passport.js 库。此库提供了身份验证的基本功能,例如定义验证策略、验证流程等等。

安装 Passport.js 的验证策略

在 Passport.js 中,我们需要为每种验证类型(例如本地验证和社交媒体验证)选择和安装相应的验证策略。让我们先安装本地验证策略 passport-local

在终端中执行以下命令:

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

此命令将安装 passport-local 策略,使我们可以在 Express.js 中添加本地身份验证功能。

实现身份验证

好的,现在我们已经安装了必要的库和策略,我们可以着手实现身份验证了。

配置 Passport.js

首先,我们需要在我们的 app.js 或者 index.js`(或其他入口文件)配置 Passport.js。

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

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

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

在上面代码中,我们首先引入了 passport 库以及 passport-local 策略。然后,我们配置 Passport.js,使用 passport.initialize() 初始化 Passport.js。接下来,我们使用 passport.use() 指定本地身份验证策略。在下面的代码中,我们将使用 passport-local 策略,并指定验证的字段为 email。然后,在策略的回调函数中,我们可以在这里添加验证逻辑。

对于密码建议使用bcrypt等库进行密码加密处理,以增加密码安全性。

实现注册功能

下面,让我们看一下如何实现注册功能。

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

在上面的代码中,我们首先添加了一个 POST /signup 路由,当用户注册时将触发此路由。在路由处理程序中,我们使用 passport.authenticate() 方法,指定验证的策略为 local-signup。这个 local-signup 策略是我们在 Passport.js 配置中定义的策略,并且它将在用户注册时使用。注意,我们将 req, res, and next 传递给了 passport.authenticate() 方法,这是必须的。然后,在验证完成后,如果出现错误,我们将返回一个 500 状态码和错误消息。如果用户重复,我们将返回一个 400 状态码和友好错误消息。最后,在注册成功时,我们将返回 200 状态码和注册成功消息。

在我们讨论的策略配置函数中done({} , user/ false / error) 按照此格式把不同的返回结果传递,第一个对象为空,第二个表示等待具体的验证结果(比如该用户名是否存在或登录结果)

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

在上面的代码中我们使用了'local-signup'策略其中一个验证功能,定义了验证时使用的字段,而指定的回调函数则具有验证功能。其中第一个参数是req,这是因为,有时需要再本地验证的字段外添加其他验证参数。 在验证函数中,我们在数据库中查找是否存在相同的用户名,如果存在,则返回一个错误消息。否则,我们创建一个新的用户对象,并保存到数据库中。如果用户创建成功,我们将使用 done() 方法将其返回。

实现登录功能

现在,我们已经了解了如何实现注册功能,接下来让我们来看一下如何实现登录功能。

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

在上面的代码中,我们添加了一个 POST /login 路由。在这个路由处理程序中,我们使用 passport.authenticate() 方法指定验证的策略为 local-login。这个策略是我们在 Passport.js 配置中定义的策略,并且它将使用登录功能。在验证完成后,如果出现错误,我们将返回一个 500 状态码和错误消息。如果用户不存在,我们将返回一个 401 状态码和错误消息。最后,在成功登录时,我们将使用 req.logIn() 方法将用户存储到会话中,并返回 200 状态码和登录成功消息。

下面是我们在 Passport.js 配置中添加的策略,它将用于处理本地登录请求。

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

在上面的代码中,我们对密码进行了一个 validPassword() 方法的调用,以确保密码正确。这个 validPassword() 方法需要在我们的 User 对象中实现,以便我们可以在验证用户时使用它。

现在你可以在 node.js 的命令行下启动项目并发起POST请求测试验证:

  1. 注册一个新用户:
---- -- -------------- ----------------- -- ---- -- ---------- ---------------------------- ------------ ----------------------------

返回

-
  ---------- ------
-
  1. 登录:
---- -- -------------- ----------------- -- ---- -- ---------- ---------------------------- ------------ ---------------------------

返回

-
  ---------- ------
-
  1. 验证失败:
---- -- -------------- ----------------- -- ---- -- ---------- ----------------------------- ------------ ---------------------------

返回

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

总结

Passport.js 是一个非常有用的库,它提供了不同的验证策略,使我们可以为我们的应用程序添加一个高效的身份验证功能。在这篇文章中,我们讨论了如何使用 Passport.js 和 Express.js 结合实现身份验证,包括注册和登录功能,以及如何指定验证策略和配置 Passport.js。我们还提供了一些示例代码以帮助你更好地理解本文所述内容。希望这篇文章对你有所帮助!

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


猜你喜欢

  • Socket.io 和 Vue 结合使用实现即时聊天系统

    在当今的数字时代,即时聊天成为了人们生活中不可或缺的一部分,它能够方便人们随时随地地交流信息。在前端类技术中,Socket.io 和 Vue 结合使用具有极高的可扩展性和可定制性,能够很容易地实现一个...

    1 年前
  • ECMAScript 2017 中的 Object.getOwnPropertyDescriptors:如何使用

    ECMAScript 2017 中的 Object.getOwnPropertyDescriptors:如何使用 ECMAScript 2017 添加了 Object.getOwnPropertyDe...

    1 年前
  • 使用 Headless CMS 构建多平台沉浸式阅读体验

    前言 如今,Web 端不再是唯一的数字媒体传播方式。移动应用和互动电子书的普及使得阅读经历越来越多样化和丰富化。在这篇文章中,我们将探讨如何使用 Headless CMS 构建一个多平台的沉浸式阅读体...

    1 年前
  • 使用 create-react-app 快速构建 React SPA 应用

    前言 React 是一个非常流行的开源 JavaScript 库,主要用于构建用户界面。在 React 中,将界面分解成多个组件,使得代码更容易维护、复用和测试。单页面应用程序(SPA)是一种使用 A...

    1 年前
  • 解决 Material Design 中 EditText 光标颜色不跟随主题变化的问题

    在 Material Design 主题下,Android EditText 的光标颜色默认是蓝色的。然而,当我们改变主题风格时,光标颜色并不会跟随主题变化,导致与主题不搭配,给用户带来困扰。

    1 年前
  • CSS Reset 的设计思路与实现方法

    前言 在网页开发的过程中,我们经常遇到样式的不兼容问题。例如,不同浏览器对于某些属性的默认值不同,在不同设备上显示也会有所差异。解决这些问题有多种方法,其中一种就是使用 CSS Reset。

    1 年前
  • CSS Grid 布局与传统布局的对比

    CSS Grid 布局是一种用于网页布局的新技术,它支持更加灵活和复杂的布局操作,提供了更加优秀的视觉效果,可以极大地提升网页的用户体验。与传统布局相比,CSS Grid 布局具有许多优势。

    1 年前
  • React Redux 如何处理大数据量的展示

    React Redux 是一个基于 React 框架的状态管理工具,它可以帮助开发者更加方便地管理 React 应用的状态并增强应用的性能。然而,当应用需要处理大量的数据时,就需要一些优化手段来提高性...

    1 年前
  • 通过 AR 技术实现市区无障碍导览系统

    身为一个前端开发工程师,我们能够想象到如何通过 AR(增强现实)技术来构建市区无障碍导览系统。 无障碍导览在现代社会中已经很普遍,它是为了方便聋哑人士,视觉障碍者以及行动不便的人而存在的。

    1 年前
  • Babel 编译 react-native 项目时出现”Error: The package @babel/runtime@^7.15.0 does not satisfy its siblings'“怎么办?

    背景 Babel 是一款用于编译 JavaScript 代码的工具,它可以将你写的新版 JavaScript 代码转换成旧版 JavaScript 代码,以支持旧版本的浏览器或 Node.js 等环境...

    1 年前
  • Webpack Encore 学习笔记

    什么是 Webpack Encore? Webpack Encore是一个Web开发工具,它为您提供了使用先进的前端工具构建网站所需的工作流程和配置。Webpack Encore可以用于JavaScr...

    1 年前
  • 如何构建自己的 Web 服务器并启动多个 Node.js 进程

    在开发前端项目的过程中,我们经常会需要搭建自己的 Web 服务器来测试和调试我们的应用程序。而 Node.js 提供了强大的库和工具来构建和启动我们自己的 Web 服务器。

    1 年前
  • ECMAScript 2016: 如何使用函数参数解构?

    ECMAScript 2016: 如何使用函数参数解构? 前言 如果你是一名有经验的 JavaScript 开发者,那么你一定已经听过 ECMAScript 2016(又称 ES7)的函数参数解构特性...

    1 年前
  • PWA 开发常见错误及其修复方法

    PWA(Progressive Web App)是一种新型的 Web 应用程序开发模式,具有类似于原生应用的体验。PWA 应用程序可以被添加到主屏幕,离线时也可以运行。

    1 年前
  • RxJS debounceTime 方法在 Angular 应用中的实际应用

    RxJS debounceTime 方法在 Angular 应用中的实际应用 随着前端应用的复杂性越来越高,我们需要使用更高效的代码来解决问题,以提升用户体验和应用性能。

    1 年前
  • 如何使用 Express.js 实现 GitHub 登录

    GitHub 是全球最大的开源代码托管平台,有数百万的开发者在上面分享代码和协作开发。为了方便开发者登录和授权使用 GitHub,GitHub 提供了 OAuth2.0 授权登录机制,开发者可以使用现...

    1 年前
  • Sequelize 中的数据操作实践及技巧

    Sequelize 是一个 Node.js 中的 ORM(对象关系映射)框架,它能够方便地与多种数据库进行交互,包括 MySQL、PostgreSQL、SQLite 和 Microsoft SQL S...

    1 年前
  • Redis 如何解决由于内存碎片导致的内存溢出问题

    Redis 是一个流行的内存数据结构存储系统,被广泛用于缓存、消息队列、会话存储等应用。内存是 Redis 最重要的资源,但长时间运行后,Redis 可能会遭受内存碎片(Memory Fragment...

    1 年前
  • 如何使用 gulp 和 ESLint 来自动化代码格式化

    前端开发的过程中,一个人写代码生产效率是高的,但是在团队中,要想保持代码的规范性,必须对代码进行格式化。而代码格式化的过程往往需要花费开发者很多时间和精力,因此,我们需要使用自动化工具来降低这种负担。

    1 年前
  • 通过 Web Components 实现前端集成开发

    在现代的前端开发中,一个项目可能会包含多个模块或组件,而这些模块或组件往往需要实现相似的功能,如表格、弹框、轮播图等。如果每个模块或组件都是独立开发、独立维护的,对于开发效率和代码复用率都是很不利的。

    1 年前

相关推荐

    暂无文章