使用Passport为Node.js应用程序提供社交认证

密码本质上是脆弱的,这已经是一个公认的事实。因此,要求最终用户为他们使用的每个应用程序创建强密码只会让事情变得更糟。

一个简单的解决方法是让用户通过现有的社交帐户(例如 Facebook、Twitter、Google 等)进行身份验证。在本文中,我们将做到这一点,并将此社交登录功能添加到在这是本身份验证系列的第一部分,以便我们能够使用 Passport 中间件通过 Facebook 和 Twitter 帐户进行身份验证。

如果您还没有阅读过上一篇文章,我建议您阅读一下它,因为我们将在此文章奠定的基础上构建新的策略、路线和视图。

社交登录

对于外行来说,社交登录是一种使用来自 Facebook、Twitter 等社交网站的现有信息的单点登录,用户通常应该已经创建了帐户。

社交登录主要依赖于 OAuth 2.0 等身份验证方案。要了解有关 OAuth 支持的不同登录流程的更多信息,请阅读本文。我们选择 Passport 来处理社交登录,因为它为各种 OAuth 提供商提供了不同的模块,无论是 Facebook、Twitter、Google、GitHub 等。在本文中,我们将使用 Passport-facebook 和 Passport-twitter 模块通过现有的 Facebook 或 Twitter 帐户提供登录功能。

Facebook 身份验证

要启用 Facebook 身份验证,我们首先需要使用 Facebook 开发者门户创建 Facebook 应用。记下应用 ID 和应用密钥,然后转至设置并在网站部分指定网站 URL,以指定回调 URL。应用。另请确保在联系电子邮件字段中输入有效的电子邮件地址。需要能够公开此应用程序并可供公众访问。

接下来,转到状态和审核部分,并将滑块转到以使应用公开。我们创建一个配置文件 fb.js 来保存连接到 Facebook 所需的配置信息。

// facebook app settings - fb.jsmodule.exports = {  'appID' : '',  'appSecret' : '',  'callbackUrl' : 'http://localhost:3000/login/facebook/callback'}

Facebook 登录策略

回到我们的 Node 应用程序,我们现在使用 FacebookStrategy 模块定义用于 Facebook 身份验证的 Passport 策略,利用上述设置来获取用户的 Facebook 个人资料并在视图中显示详细信息。

passport.use('facebook', new FacebookStrategy({  clientID        : fbConfig.appID,  clientSecret    : fbConfig.appSecret,  callbackURL     : fbConfig.callbackUrl},  // facebook will send back the tokens and profile  function(access_token, refresh_token, profile, done) {// asynchronousprocess.nextTick(function() {      // find the user in the database based on their facebook id  User.findOne({ 'id' : profile.id }, function(err, user) {    // if there is an error, stop everything and return that    // ie an error connecting to the database    if (err)      return done(err);  // if the user is found, then log them in      if (user) {        return done(null, user); // user found, return that user      } else {        // if there is no user found with that facebook id, create them        var newUser = new User();// set all of the facebook information in our user model        newUser.fb.id    = profile.id; // set the users facebook id                        newUser.fb.access_token = access_token; // we will save the token that facebook provides to the user                        newUser.fb.firstName  = profile.name.givenName;        newUser.fb.lastName = profile.name.familyName; // look at the passport user profile to see how names are returned        newUser.fb.email = profile.emails[0].value; // facebook can return multiple emails so we'll take the first// save our user to the database        newUser.save(function(err) {          if (err)            throw err;          // if successful, return the new user          return done(null, newUser);        });     }   });    });}));

配置路由

现在我们需要添加某些路由,以启用 Facebook 登录以及在用户授权应用程序使用其 Facebook 帐户后处理回调。

// route for facebook authentication and login// different scopes while logging inrouter.get('/login/facebook',   passport.authenticate('facebook', { scope : 'email' }));// handle the callback after facebook has authenticated the userrouter.get('/login/facebook/callback',  passport.authenticate('facebook', {    successRedirect : '/home',failureRedirect : '/'  }));

我们的演示应用程序的登录页面如下所示:

使用Passport为Node.js应用程序提供社交认证

当您点击使用 Facebook 登录按钮时,它将尝试通过 Facebook 进行身份验证。如果您已经登录 Facebook,它将显示以下对话框,请求您的许可,否则它将要求您登录 Facebook,然后显示此对话框。

使用Passport为Node.js应用程序提供社交认证

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

如果您允许应用接收您的公开个人资料和电子邮件地址,那么我们注册的回调函数将与用户一起调用细节。我们可以保存这些信息以供将来参考,或者显示它们,或者干脆选择忽略它们,具体取决于您想要如何处理这些信息。请随时跳转并查看此 git 存储库中的完整代码。

值得注意的是,除了此演示应用程序提供的基本信息之外,您还可以使用相同的身份验证机制通过使用适当的范围并使用Facebook API 以及通过用户个人资料收到的访问令牌。

Twitter 身份验证

需要连接一个类似的身份验证模块来通过 Twitter 处理身份验证,并插入 Passport 芯片以帮助其 passport-twitter 模块。

首先,您需要使用其应用程序管理界面创建一个新的 Twitter 应用程序。这里需要注意的一件事是,在指定回调 URL 时,如果在回调 URL 字段中给出“localhost”,Twitter 似乎无法很好地使用它。为了在开发时克服此限制,您可以使用特殊的环回地址或“127.0.0.1”来代替“localhost”。创建应用程序后,在配置文件中记下以下 API 密钥和机密信息,如下所示:

// twitter app settings - twitter.jsmodule.exports = {    'apikey' : '','apisecret' : '','callbackUrl' : 'http://127.0.0.1:3000/login/twitter/callback'}

Twitter 登录策略

Twitter 的登录策略是 TwitterStrategy 的一个实例,如下所示:

passport.use('twitter', new TwitterStrategy({    consumerKey     : twitterConfig.apikey,    consumerSecret  : twitterConfig.apisecret,    callbackURL     : twitterConfig.callbackURL  },  function(token, tokenSecret, profile, done) {    // make the code asynchronous    // User.findOne won't fire until we have all our data back from Twitter    process.nextTick(function() {   User.findOne({ 'twitter.id' : profile.id },         function(err, user) {          // if there is an error, stop everything and return that  // ie an error connecting to the database      if (err)        return done(err);// if the user is found then log them in        if (user) {           return done(null, user); // user found, return that user        } else {           // if there is no user, create them           var newUser                 = new User();   // set all of the user data that we need           newUser.twitter.id          = profile.id;           newUser.twitter.token       = token;           newUser.twitter.username = profile.username;           newUser.twitter.displayName = profile.displayName;           newUser.twitter.lastStatus = profile._json.status.text;   // save our user into the database           newUser.save(function(err) {             if (err)               throw err;             return done(null, newUser);           });        }     });  });    }));

配置路由

// route for twitter authentication and login// different scopes while logging inrouter.get('/login/twitter',    passport.authenticate('twitter'));// handle the callback after facebook has authenticated the userrouter.get('/login/twitter/callback',  passport.authenticate('twitter', {successRedirect : '/twitter',failureRedirect : '/'  }));/* GET Twitter View Page */router.get('/twitter', isAuthenticated, function(req, res){  res.render('twitter', { user: req.user });});

现在要对此进行测试,请务必使用 http://127.0.0.1: 而不是使用 http: //localhost:.正如我们上面已经提到的,在使用“localhost”作为主机名与 Twitter 交换令牌时似乎存在问题。单击使用 Twitter 登录按钮时,正如预期的那样,它会请求用户同意允许此应用程序使用 Twitter。

使用Passport为Node.js应用程序提供社交认证

当您允许应用程序访问您的 Twitter 帐户和有限信息时,登录策略中注册的回调处理程序为调用,然后用于将这些详细信息存储在后端数据库中

结论

这就是你拥有的!我们成功地将 Facebook 和 Twitter 登录添加到示例应用程序中,而无需编写大量代码并通过让 Passport 完成繁重的工作来处理与身份验证机制相关的复杂问题。可以为 Passport 支持的各种提供程序编写类似的登录策略。整个应用程序的代码可以在此 git 存储库中找到。请随意扩展它并在您自己的项目中使用它。

以上就是使用Passport为Node.js应用程序提供社交认证的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/534553.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 12:13:40
下一篇 2025年11月9日 12:19:00

相关推荐

  • 使用PhpStorm进行TypeScript开发的步骤

    phpstorm支持typescript开发,需配置环境并安装相关工具。1. 安装node.js并检查版本;2. 通过npm安装typescript,推荐本地安装以便项目独立管理;3. 在phpstorm中开启typescript支持并选择正确版本;4. 创建tsconfig.json文件以配置编译…

    2025年12月5日 后端开发
    000
  • 一键PHP环境可以运行Nodejs项目吗_Nodejs环境兼容性

    一键PHP环境不支持Node.js项目,需单独安装Node.js并配置反向代理实现服务协同。 一键PHP环境通常是指集成了Apache/Nginx、MySQL、PHP等组件的集成环境,比如WAMP、XAMPP、PHPStudy等。这类环境主要针对PHP项目设计,默认情况下并不包含Node.js运行时…

    2025年12月4日
    000
  • VSCode怎么用NodeJS联想_VSCode配置NodeJS智能提示与补全教程

    答案:要让VSCode中Node.js代码拥有智能提示和自动补全,需确保项目包含package.json、配置jsconfig.json文件、正确安装第三方库及其@types类型定义。首先通过npm init -y创建package.json,再安装依赖如express,并用npm install …

    2025年12月3日
    000
  • 如何使用 GraalVM 本地编译 Java 无服务器应用程序?

    使用 graalvm 本地编译 java 无服务器函数:安装 graalvm。使用 aws lambda 设置无服务器框架。编写 java 代码。使用 native-image 命令编译 java 代码。部署本机可执行文件到 lambda。配置函数使用本机可执行文件,并设置 graalvm_home…

    2025年12月2日 java
    000
  • Serverless Framework vs. Java 框架:哪种更适合无服务器应用程序?

    对于无服务器应用程序,serverless framework 提供了简易部署、跨平台兼容性和自动扩展等优点,适用于优先考虑易用性和可伸缩性的场景。而 java 框架则提供了灵活性、高性能和广泛的社区支持,适用于需要定制架构、高性能处理和 java 生态系统支持的情况。 Serverless Fra…

    2025年12月2日 java
    000
  • CSS怎样实现数据标签云—随机大小颜色方案

    实现带有随机大小和颜色的css标签云,核心在于使用javascript生成随机数值并将其应用到html元素的样式上。1. html提供标签结构;2. javascript生成随机字体大小和颜色,并注入到每个标签的style属性中;3. css负责基础样式和过渡效果渲染。通过结合html、css与ja…

    2025年12月2日 web前端
    000
  • 关于NodeJs如何使用Mysql模块实现事务处理实例

    本篇文章主要介绍了nodejs使用mysql模块实现事务处理 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 依赖模块: 1. mysql npm install mysql –save 2. async npm install async –save (ps: a…

    数据库 2025年12月2日
    000
  • perplexity怎么安装电脑版_perplexity电脑版安装教程

    可通过浏览器将Perplexity网站添加到桌面实现应用化,或使用Electron技术打包为独立程序,还可借助WebApp.io等第三方平台生成安装包,三种方法均能高效在电脑端使用Perplexity。 如果您希望在电脑上使用Perplexity以获得更高效的搜索和问答体验,可以通过多种方式实现。由…

    2025年12月1日 软件教程
    000
  • App Engine 模块:独立代码库与多运行时配置详解

    app engine 模块允许开发者为同一应用部署独立的 go 代码库,并支持配置不同的运行时环境。这一范式打破了传统上认为所有模块必须共享同一代码库的限制,极大地增强了应用的灵活性和可扩展性。通过为每个模块指定独立的配置文件和根目录,开发者可以构建微服务架构,充分利用不同语言的优势,从而优化应用性…

    2025年12月1日 后端开发
    000
  • Google App Engine Go 模块:独立代码库与多运行时支持

    Google App Engine(GAE)的模块化设计允许开发者为每个服务(模块)使用独立的源代码库,并支持配置不同的运行时环境。这一特性打破了传统应用共享单一代码库的限制,极大地增强了应用的灵活性、可维护性,并使得在同一应用中集成多种编程语言和技术栈成为可能,从而优化了特定任务的执行效率。 Ap…

    2025年12月1日 后端开发
    000
  • Google App Engine 模块化部署:突破单一代码库限制

    本文旨在澄清google app engine go模块是否必须共享同一代码库的常见误解。我们将深入探讨app engine模块化架构,阐明每个模块不仅可以拥有独立的运行时环境,还能维护各自的代码库。这极大地提升了应用设计的灵活性,允许开发者在同一应用中融合多种语言和技术栈,从而充分利用各语言的优势…

    2025年12月1日 后端开发
    000
  • GAE跨服务任务提交策略:从Python服务调度Node.js任务

    本文详细阐述了在Google App Engine (GAE) 环境中,如何实现从一个服务(如Python)提交任务,并由另一个服务(如Node.js)执行的策略。核心方法包括:利用dispatch.yaml配置基于URL路径的任务路由,使relative_uri直接指向目标服务;或采用间接方式,通…

    2025年11月29日 后端开发
    000
  • 如何在Linux上使用Swagger优化API设计

    本文介绍如何在Linux系统中利用Swagger提升API设计的效率和质量。我们将逐步讲解Swagger Editor、Swagger UI的安装和配置,以及在Spring Boot项目中集成Swagger的方法,并演示如何使用Swagger注解定义API文档,最终在IntelliJ IDEA中利用…

    2025年11月29日 系统教程
    000
  • Linux Node.js日志轮转策略怎样配置

    本文介绍两种在Linux系统中实现Node.js应用日志轮转的策略。 方法一:利用logrotate工具 logrotate是Linux系统自带的日志管理工具,可用于日志文件的轮转、压缩和删除。 安装logrotate(若未安装): sudo apt-get install logrotate # …

    2025年11月29日 系统教程
    000
  • 如何清理Node.js日志文件

    Node.js日志文件的清理方法多种多样,您可以根据实际情况选择最合适的方式: 方法一:手动删除 最直接的方法是手动删除日志文件。通常,日志文件存储在项目根目录下的logs文件夹中。您可以使用文件管理器或命令行工具找到并删除这些文件。 方法二:使用rm命令 在命令行中,进入日志文件所在的目录,然后使…

    2025年11月29日 系统教程
    000
  • 如何在Node.js程序中重连MySQL连接?

    如何在node.js程序中重连mysql连接? MySQL是一种流行的关系型数据库,而Node.js是一种非常流行的服务器端编程语言。将两者结合使用是很常见的,在Node.js程序中连接到MySQL数据库可以让我们对数据进行操作、存储和检索。然而,有时候MySQL连接可能会由于各种原因断开,这时我们…

    数据库 2025年11月29日
    000
  • Node.js 版本升级中 node-gyp 错误排查与 Yarn 解决方案

    在将 Node.js 版本升级至 20.9.0 等新版本时,开发者常遇到 `node-gyp` 编译原生模块的错误,尤其表现为 Python 环境配置不当或网络下载 Node.js 头文件失败。本文将深入分析这些错误的原因,提供 Python 和构建工具的排查方法,并重点介绍如何通过切换到 Yarn…

    2025年11月29日 后端开发
    000
  • 我参加了全栈训练营课程

    我做了什么! 我最近浏览了一个新手训练营的两小时视频,其中我构建并部署了一个全栈应用程序。 我只花了六个小时…… 这是我的一些收获。 内联 css 的正确模式和约定很困难。未考虑重构。使用 node server 来推送 react build 很尴尬。没有单元测试。部署是一…

    2025年11月28日 web前端
    000
  • 变更集中的 Nodejs util 模块用法

    您将在 changesets 源代码中的第 4 行找到导入内容 import { format } from “util”; 本文概述了 util 模块及其在变更集中的用法。 实用模块 util模块主要是为了支持node.js自己的内部api的需求而设计的。然而,许多实用程序对于应用程序和模块开发人…

    2025年11月28日 web前端
    000
  • JavaScript 使用 Nodejs 并访问和修改 phpMyAdmin 数据库

    嗨, 我是新手,以前从未这样做过。 简单来说,我有一个 C# 语言的 Visual Studio Windows 窗体应用程序,需要许可功能。 当用户点击“购买”按钮时会打开网站,付款成功后会重定向到某个网页网址。 我想使用 JavaScript 来完成一些任务。 立即学习“PHP免费学习笔记(深入…

    2025年11月28日
    000

发表回复

登录后才能评论
关注微信