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

yizhihongxing

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日

相关文章

  • nodejs使用node-xlsx生成excel的方法示例

    下面我来详细介绍如何使用node-xlsx生成Excel的方法。 1. 安装node-xlsx 第一步是安装node-xlsx这个包。 在命令行中输入以下命令: npm install node-xlsx –save 2. 创建Excel文件 创建一个Excel文件的步骤如下: 创建一个工作簿(Workbook); 往工作簿里面添加一个工作表(Worksh…

    node js 2023年6月8日
    00
  • 捕获未处理的Promise错误方法

    当Promise在执行过程中出现错误,但该Promise的错误处理函数没有被调用时,这时就需要通过捕获未处理的Promise错误方法来处理该错误。 以下是完整的攻略: 1. 使用unhandledRejection事件捕获未处理的Promise错误 Node.js提供unhandledRejection事件,用于捕获未处理的Promise错误。当一个Prom…

    node js 2023年6月8日
    00
  • Nodejs文件上传、监听上传进度的代码

    下面是详细讲解“Nodejs文件上传、监听上传进度的代码”的完整攻略。 文件上传 文件上传是指将用户选择的文件传输到服务器上,以便服务器进行处理并存储。Nodejs中实现文件上传的方法有很多,下面是一种通用的实现方法: 首先,需要使用multer模块处理文件上传的请求。这个模块可以很方便地处理上传文件的解析和存储。 const express = requi…

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

    Node.js中的console.assert方法使用说明 简介 console.assert()是Node.js中自带的一个断言方法,其主要功能是在表达式为“假”的情况下输出错误信息。 语法 console.assert(expression, message) expression: 必需。一个布尔表达式,如果为false,则会触发一个Assertion…

    node js 2023年6月8日
    00
  • react中的虚拟dom和diff算法详解

    下面我会针对”React中的虚拟DOM和Diff算法详解”这一话题,给出一份完整攻略。该攻略分为三个部分:React中的虚拟DOM、虚拟DOM的Diff算法、示例说明。 React中的虚拟DOM 虚拟DOM是一种内存中的表示方式,其将DOM的结构以JavaScript对象的形式表示出来。React使用虚拟DOM来管理实际DOM的渲染和更新,因为操作一次真实D…

    node js 2023年6月8日
    00
  • Node.js配合node-http-proxy解决本地开发ajax跨域问题

    Node.js是JavaScript运行时环境,可以编写后端服务。对于前端开发中的ajax跨域问题,可以使用Node.js配合node-http-proxy来解决。 node-http-proxy是Node.js的一个HTTP代理服务器模块,它可以将请求代理到其他服务器上,并处理响应数据。通过配置代理规则,使得前端开发时可以访问后端接口,而无需担心跨域问题。…

    node js 2023年6月8日
    00
  • 关于Node.js中Buffer的一些你可能不知道的用法

    关于Node.js中Buffer的一些你可能不知道的用法完整攻略如下: 简介 在Node.js中,Buffer是一个用于处理二进制数据的对象。在Buffer中,可以存储任意长度的数据,并且可以通过索引访问每个字节。 创建Buffer实例 Node.js中Buffer对象可以通过以下方式创建: // 创建指定长度的Buffer const buf1 = Buf…

    node js 2023年6月8日
    00
  • Nodejs实现批量下载妹纸图

    下面是“Nodejs实现批量下载妹纸图”的完整攻略: 1. 准备工作 首先需要安装 Node.js 和 NPM(Node Package Manager),可以在官网下载安装程序。 然后在命令行窗口中使用以下命令安装必要的模块: npm install request cheerio mkdirp –save request:用于发送 HTTP/HTTPS…

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