Node.js express中的身份认证的实现

Node.js和Express实现身份认证的过程大致包含以下几个步骤:

  1. 安装相关插件

在Node.js和Express中,通常使用passport和passport-local插件作为身份认证的工具。可以使用npm安装:

npm install passport passport-local
  1. 配置身份认证策略

在应用程序的启动文件中(例如 app.js)引入passport和passport-local:

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

然后定义本地策略并注册它:

passport.use(new LocalStrategy(
  function(username, password, done) {
    // 假设我们有一个 users 数据库表,包含以下字段:id、username、password
    db.users.findByUsername(username, function(err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (user.password !== password) { return done(null, false); }
      return done(null, user);
    });
  }
));

上述代码定义了一个本地策略,它会从我们的数据库中查询数据来验证用户输入的用户名和密码是否正确。findBUsername函数是假设的,你需要根据实际情况实现一个真正的函数,将它替换掉。

  1. 应用身份认证中间件

在应用程序的启动文件中,添加以下代码:

app.use(require('express-session')({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());

第一行代码是用来启用express-session中间件的,它是必须的。第二行代码启用passport中间件,第三行代码启用 session 支持。

  1. 定义路由

要使用身份验证,需要定义至少两个路由:一个用于登录,一个用于处理已登录的用户请求。以下是一个简单的登录路由的示例:

app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/dashboard');
  });

如果验证成功,它将会返回一个成功的响应。否则,将会重定向到 /login 页面。

  1. 实现保护路由

在路由的最前面加上 passport.authenticate 方法即可保护该路由,如果用户没有登录,则会自动重定向到登陆页面。以下是一个示例:

app.get('/profile', 
  require('connect-ensure-login').ensureLoggedIn(),
  function(req, res) {
    res.render('profile', { user: req.user });
  });

在上述代码中,connect-ensure-login 模块用来保护路由,ensureLoggedIn() 方法将检查用户是否登录,如果没有登录,则会重定向到登录页面。

示例1:

const express = require("express");
const app = express();
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

// 配置登录策略
passport.use(new LocalStrategy(
  function(username, password, done) {
    // 假设我们有一个 users 数据库表,包含以下字段:id、username、password
    db.users.findByUsername(username, function(err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (user.password !== password) { return done(null, false); }
      return done(null, user);
    });
  }
));
app.use(require('express-session')({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());

// 登录
app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/profile');
  });

// 保护路由,需要登录才可以访问
app.get('/profile', 
  require('connect-ensure-login').ensureLoggedIn(),
  function(req, res) {
    res.render('profile', { user: req.user });
  });

app.listen(3000, () => console.log(`Server started on port 3000`));

示例2:

const express = require("express");
const app = express();
const passport = require('passport');
const FacebookStrategy = require('passport-facebook').Strategy;

// 配置Facebook策略
passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: "http://www.example.com/auth/facebook/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOrCreate({ facebookId: profile.id }, function (err, user) {
      return done(err, user);
    });
  }
));
app.use(require('express-session')({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());

// 登录
app.get('/auth/facebook',
  passport.authenticate('facebook'));

app.get('/auth/facebook/callback',
  passport.authenticate('facebook', { successRedirect: '/',
                                      failureRedirect: '/login' }));

// 保护路由,需要登录才可以访问
app.get('/profile', 
  require('connect-ensure-login').ensureLoggedIn(),
  function(req, res) {
    res.render('profile', { user: req.user });
  });

app.listen(3000, () => console.log(`Server started on port 3000`));

以上就是Node.js和Express中实现身份认证的常见方法和步骤。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js express中的身份认证的实现 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • PHP+JS实现大文件切片上传功能实现实例源码

    下面来详细讲解 “PHP+JS实现大文件切片上传功能实现实例源码”的完整攻略。 简介 本文讲解了如何采用 PHP 和 JS 实现大文件切片上传功能,将大文件切割为多个小文件进行上传,避免了一次性上传文件过大导致的造成服务器瘫痪的问题。 实现步骤 1.划分切片 使用 JS 将大文件划分为多个小文件进行上传。 示例代码: //创建FormData对象,进行文件上…

    node js 2023年6月8日
    00
  • Node.js REPL (交互式解释器)实例详解

    Node.js REPL (交互式解释器)实例详解 什么是REPL REPL是一种编程语言解析器,它可以接受用户的输入,解释一条语句并立即执行,然后输出结果。REPL通常用于测试代码片段、学习语言概念以及进行快速原型设计。 Node.js REPL提供了一个交互式环境,通过命令行操作与Node.js交互,可以测试代码片段,进行调试和熟悉Node.js API…

    node js 2023年6月8日
    00
  • Lua协同程序coroutine的简介及优缺点

    Lua中的协同程序coroutine是一种特殊的线程,它允许您在相同进程中的不同代码段之间切换执行。与操作系统线程相比,coroutine更加轻量级,且由于没有线程间的切换和锁竞争开销,所以使用coroutine可以有效提高性能。 如何创建一个coroutine 在Lua中,使用函数coroutine.create()可以创建一个coroutine对象,例如…

    node js 2023年6月8日
    00
  • node.js chat程序如何实现Ajax long-polling长链接刷新模式

    Node.js是一个基于事件驱动、非阻塞IO模型的服务器端JavaScript运行环境。开发人员可以使用Node.js来轻松构建高性能的网络应用程序,包括聊天程序。Ajax long-polling长链接刷新模式可以使聊天程序更具响应性和实时性。下面是实现的完整攻略: 步骤1:创建Express应用程序 首先,需要使用Node.js的Express框架创建一…

    node js 2023年6月8日
    00
  • node.js中的fs.fchown方法使用说明

    下面详细讲解一下“node.js中的fs.fchown方法使用说明”的完整攻略。 1. fs.fchown方法的介绍 在Node.js中,fs模块提供了多个操作文件的API,其中fs.fchown是用于更改一个文件的所有者和组的方法。该方法需要传入3个参数,分别是文件的文件描述符(fd)、文件所有者的uid以及文件组的gid。 文件描述符可以通过fs.ope…

    node js 2023年6月8日
    00
  • 浅谈Vue3中key的作用和工作原理

    下面就是“浅谈Vue3中key的作用和工作原理”的完整攻略。 什么是key? Vue中的key是v-for指令中的一个特殊属性。当Vue更新组件列表时,Vue会将列表中的每个节点与其之前的节点进行对比,并通过一种算法来尽量少地更改DOM树。通过使用key属性,同时考虑节点的顺序、类型和内容,Vue可以更好地确定哪些节点需要被更新,删除或添加。 key的作用 …

    node js 2023年6月8日
    00
  • 轻松创建nodejs服务器(4):路由

    以下是“轻松创建nodejs服务器(4):路由”的详细攻略。 步骤1:创建路由函数 在Node.js中,路由就是指对于请求的URL进行处理的函数,所以第一步就是创建路由函数。这里我们可以使用一个简单的JavaScript对象来管理路由: var routes = { "/": function(request, response) { r…

    node js 2023年6月8日
    00
  • node运行js获得输出的三种方式示例详解

    关于”node运行js获得输出的三种方式示例详解”,我为您提供以下攻略。 1. Node.js 环境基础 在介绍三种方式之前,需要着重强调Node.js环境的必要性。Node.js环境是指运行JavaScript代码的环境,它是基于Google Chrome V8 引擎构建的一种开源的JavaScript运行环境。要在本机运行JavaScript代码,需要在…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部