PassportJs 身份验证无限循环和执行(默认)查询

2024-01-27

我正在尝试使用 PassportJs 和 Sequelize 构建身份验证系统。我自己制作了注册系统,使用Sequelize。我只想使用 PassportJS 进行登录。

它不会将我重定向到 failureRedirect 路由,也不会重定向到 SuccessRedirect 路由,但是在提交表单时,它会进入无限循环,并且在我的控制台中出现以下消息:

 Executing (default): SELECT `id`, `username`, `lastName`, `password`,  `email`, `phone`, `createdAt`, `updatedAt` FROM `user` AS `user` LIMIT 1;   

我的项目结构如下: users_model.js 、 index.js 和 users.js (控制器)。

我的 index.js 中的代码如下所示:

//===============Modules=============================
var express = require('express');
var bodyParser = require('body-parser');   
var session = require('express-session');
var authentication= require('sequelize-authentication');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var passportlocal= require('passport-local');
var passportsession= require('passport-session');

var User = require('./models/users_model.js');


passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));


passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
    console.log(id);
  });
});


var users= require('./controllers/users.js');    
var app = express();


app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');


app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.use('/users', users);
app.use('/events', events);

//-------------------------------------------Setup Session------------
app.use(session({
    secret: "ceva",
    resave:true,
    saveUninitialized:true,
    cookie:{},
    duration: 45 * 60 * 1000,
    activeDuration: 15 * 60 * 1000,
}));


// Passport init
app.use(passport.initialize());
app.use(passport.session());

//------------------------------------------------Routes----------
app.get('/', function (req, res) {
     res.send('Welcome!');
});

   //-------------------------------------Server-------------------

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

在我的控制器中,我使用 Sequelize 自己制作了注册系统。在 users.js 中,我有:

var express = require('express');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var passportlocal= require('passport-local');
var passportsession= require('passport-session');
var router = express.Router();

var User = require('../models/users_model.js');

//____________________Initialize Sequelize____________________

const Sequelize = require("sequelize");
const sequelize = new Sequelize('millesime_admin', 'root', '', {
  host: 'localhost',
  dialect: 'mysql',
  pool: {
    max: 5,
    min: 0,
    idle: 10000
  }
}); 

//________________________________________


router.get('/',function(req,res){
res.send('USERS');
});

router.get('/register', function(req, res) {
     res.render('registration', {title: "Register" });
});

router.post('/register', function(req, res) {
    var email = req.body.email;
    var password = req.body.password;
    var username= req.body.username;
    var lastname= req.body.lastname;
    var phone= req.body.phone;

   User.findAll().then(user => {
    usersNumber = user.length;
    x=usersNumber+1;
    var y =usersNumber.toString();
    var uid='ORD'+ y;

    User.sync().then(function (){
      return User.create({
      id:uid,
      email: email,
      password:password,
      username: username,
      lastName: lastname,
      phone: phone,
         });
    }).then(c => {
        console.log("User Created", c.toJSON());
         res.redirect('/users');
    }).catch(e => console.error(e));    
 });    
});

router.get('/login',function(req,res){
    res.render('authentication');
});

//router.post('/login', function(req, res, next) {
//    console.log(req.url);  // '/login'
//    console.log(req.body);
// I got these:{ username: 'username', password: 'parola' } 
//    passport.authenticate('local', function(err, user, info) {
//        console.log("authenticate");
//        console.log('error:',err);
//        console.log('user:',user);
//        console.log('info:',info);
//    })(req, res, next);
//});


router.post('/login', passport.authenticate('local', { 
    successRedirect: '/events',                    
    failureRedirect: '/users/register' 
    }));

router.get('/logout', function(req, res){
    req.logout();    
    res.redirect('/users/login');
});    

//__________________________________________
module.exports = router;

主要问题:not无限循环,但 Sequelize 的使用不正确

这不是无限循环,而只是来自服务器的挂起响应,该响应将以超时错误结束。

当你这样做时:

passport.use(new LocalStrategy(
  function(username, password, done) {
    ...
  }
));

...passport and express等待done要调用的函数。一旦它done(),它们在中间件链中前进并将响应发送给客户端。

The donefunction没有被调用,因为Sequelize似乎不支持回调函数,但是promise。因此,调用 Sequelize 方法的正确方法是:

User.findOne({ username: username }).then(user => {
  if (!user) {
    return done(null, false, { message: 'Incorrect username.' });
  }
  if (!user.validPassword(password)) {
    return done(null, false, { message: 'Incorrect password.' });
  }
  done(null, user);
}).catch(err => done(err));

(de)序列化会话用户

好像没有id用户实例中的字段,但是userid。因此我们必须这样做:

passport.serializeUser(function(user, done) {
  done(null, user.userid);
});

passport.deserializeUser(function(id, done) {
  User.findOne({ userid: id }).then(user => {
    done(null, user);
    console.log(id);
  }).catch(err => done(err));
});

以供参考,这次提交 https://github.com/coltaemanuela/auth-system-using-sequelize-and-passport/commit/36d92d4f059353aa78a9de34d3a355c4486f581a修复这些问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PassportJs 身份验证无限循环和执行(默认)查询 的相关文章

  • Node.js 上的 starttls > 0.4.0

    我遇到了这个线程Node js HTTPS 安全错误 https stackoverflow com questions 5136353 node js https secure error其中提到 tls 模块是现在在节点上执行 TLS
  • 如何使用 next auth 通过自定义 Spring API 库和端点进行身份验证

    我是 Next js 的新手 正在将我的前端从 React 迁移到 Next v4 我已经使用 Spring 开发了一个后端 它连接到 Azure 上托管的 MySQL 数据库 该 API 在 Postman 和 React 前端上经过全面
  • 如何使用 Chai Http 发布对象数组

    我正在尝试发布一个对象数组ChaiHttp https github com chaijs chai http像这样 agent post route to api send locations lat lat1 lon lon1 lat
  • 构建:找不到“节点”的类型定义文件

    VS 2015 社区版 在家 npm 3 10 Angular 2 我试图在 ASP Net MVC 5 应用程序中获取 Angular2 设置 我开始使用的模板使用旧版本的 Angular 因此我更新了包引用 当我构建时 列表中的第一个错
  • 嵌套异步/等待 Nodejs

    似乎无法弄清楚为什么这对我不起作用 我有一个父函数 它对子加载进程执行 AWAIT LOAD 进程又调用另一个名为 LOADDATA 的 AWAIT 所以基本上是这样的 module exports async function try a
  • 一次更新猫鼬中的多个文档

    我有一个用户文档数组 每个用户都有关注者属性 它是一个数字 我只想将此属性增加 1 然后立即更新数据库中的所有这些用户文档 更多细节 在请求中 我有一组用户 id 我使用这些 id 进行查询以获取一组用户文档 const users awa
  • 从节点服务器访问 Google Calendar API

    由于某种原因 我很难访问 Google 日历 我希望能够在 Node js 服务器的日历中添加和删除事件 我从文件中发现了非常矛盾的信息 我跟着 https developers google com identity protocols
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch
  • 无法启动活动?

    在添加异步任务之前 我对代码进行了一些更改 我的应用程序可以正常工作 从远程服务器验证用户名和密码 但在登录成功消息消失时无法启动其他活动 有人建议我添加异步任务 现在我已经添加了该任务 但是当我输入正确的用户名和密码时 它会停止工作 当我
  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • 在哪里可以找到 OpenID 提供商 URL 列表? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我已经在我的网站上实现了 OpenID 但我很难找到 OpenID 提供商 URL 列表 我以为这很容
  • 错误关系不存在

    我得到了 error relation causes does not exist 我的节点应用程序出现错误 这种关系确实存在 我不确定问题出在哪里 我创建了该表 CREATE TABLE causes cause id bigint NO
  • 如何阻止 Node.js 服务器崩溃

    我是节点js新手 我试图创建一个简单的 HTTP 服务器 我按照著名的例子创建了一个 Hello World 服务器如下 var handleRequest function req res res writeHead 200 res1 e
  • web3.eth.sendSignedTransaction() 总是返回“返回错误:nonce 太低”

    I used 电子邮件受保护 cdn cgi l email protection在 Node js 中与私有区块链交互 我是按照官方文档写的代码 电子邮件受保护 cdn cgi l email protection var Web3 re
  • axios 请求中未发送正文数据

    我试图通过 axios 请求将数据发送到我的后端脚本 但正文看起来是空的 这是前端发送的请求 axios request method GET url http localhost 4444 next api headers Authori
  • 如何将多个 api 请求中的多个可读流传输到单个可写流?

    期望的行为 实际行为 我尝试过的 重现步骤 研究 期望的行为 将从多个 api 请求接收到的多个可读流传输到单个可写流 API 响应来自 ibm watsontextToSpeech synthesize https cloud ibm c
  • Nodejs 中的子域

    如何处理nodejs的子域请求 例如以下代码回显test在控制台中的任何请求http localhost 9876 任何内容 http localhost 9876 5Banything 5D var http require http h
  • 全局传递 xhr onload 函数的值

    在我正在创建的应用程序中 我有以下 XMLHttpRequest 并且我正在尝试传递结果data在 的里面xhr onload 到在同一父函数中创建的数组中 var url http api soundcloud com resolve j
  • 在文件之间共享 mqtt 客户端对象

    我这样连接到 MQTT mqtt js const mqtt require mqtt var options needed options var client mqtt connect mqtt someURL options clie
  • 监听文件夹和文件(更改)

    可以直接在 PHP 或 Node 上监听文件夹和文件的更改 通过事件 还是我需要创建自己的方法来执行此操作 Example 我需要听文件夹 user 如果我将一些文件添加到该目录中 PHP 或 Node 会收到信息并运行PathEvent

随机推荐

  • Mathematica 表达式开头的非交换乘法和负系数

    在一些非常友善的 stackoverflow 贡献者的帮助下在这篇文章中 https stackoverflow com questions 5023863 redefine noncommutative multiplication in
  • 如何在 Codeigniter 中创建小部件系统

    我正在 Codeigniter 中创建一个自定义 CMS 并且我想要一个类似于 Wordpress 中使用的小部件系统 例如 我想要一个小部件 显示侧边栏上显示的最后 5 篇帖子 我还希望能够逐页控制此小部件显示的页面 我在用Phil St
  • 制作频率表

    我应该创建一个包含 256 个 DWORD 的频率表 并使用 ASCII 代码作为索引来计算字符串中字符出现的次数 我陷入了如何使用存储的 ASCII 值作为索引并增加该索引的困境 这是我到目前为止所拥有的 TITLE String Fin
  • jsf 2.2(最终版)不适用于 Jboss 7.1.1

    在我看来 JSF 2 2 在 JBoss 7 1 1 上根本不起作用 使用 jboss 的 multi jsf 我只是用 jsf 2 2 的相应 jar 替换了 jsf api 和 jsf 实现模块 当我的应用程序启动时 我看到以下错误 0
  • 为什么stream::good 是错误的示例?

    我给出了一个答案 我想每次通过循环检查流的有效性here https stackoverflow com a 28277950 2642059 我原来使用的代码good看起来类似于 ifstream foo foo txt while fo
  • TabLayout:单击Tab TextView可在列表视图顶部滚动

    我在 TabLayout 中有两个片段 现在 我想向选项卡添加一个 onclick 侦听器 每个片段都包含一个列表视图 是否可以单击选项卡布局并将列表视图置于顶部 谢谢 覆盖onTabReslected Tab tab method htt
  • shell脚本来杀死tomcat服务,如果它在一定时间后没有被stop命令停止?

    我想编写shell脚本来启动和停止tomcat服务器 为了停止tomcat 我使用这个命令 bin shudown sh 或 bin catalina sh stop 大多数情况下这不起作用 tomcat仍在运行 所以我想在发出关闭命令后杀
  • C++ 正则表达式 Visual Studio Community 2015 给出意外结果

    使用 Visual Studio Community 2015 C 使用意想不到的结果 源代码 include
  • XPath 获取父元素

    我有一个与 XPath 相关的问题 我有一个 XML 条目列表 如下所示
  • 如何设置子两个div 50%,与父div 50%

    我有以下类型的模式 如何将第一个和第二个子 Div 类的 css 更改应用到父 div 的 50 如何给子div设置50 50 div class parentDiv div class childDiv 50 width div div
  • Java类型检查器注解的@Retention

    Java 8 类型注释 JSR 308 允许类型检查器执行静态代码分析 例如 检查器框架 https checkerframework org 可以检查是否有可能nullness via NonNull注释 不同的项目定义了自己的NonNu
  • C# - 可以隐藏公共继承的方法(例如,将其设为派生类的私有方法)

    假设我有带有公共方法 A 和 B 的 BaseClass 并通过继承创建 DerivedClass e g public DerivedClass BaseClass 现在我想在 DerivedClass 中开发一个使用 A 和 B 的方法
  • 检查2个R程序是否相同

    最近我了解到我可以使用identical or all equal检查 2 个数据集是否相同 我还可以用它们来检查 2 个 R 程序是否相同吗 还有比下面更好或更合适的方法吗 program 1 lt readLines c r stuff
  • 是否可以使用 Windows 命令行编辑二进制文件?

    Windows 中有没有办法从命令行编辑二进制文件 即可以写入批处理文件的方式 我希望能够在现有文件中的已知位置编辑单个字节 这个现有问题 1 已经解决 但这是一个 Linux 解决方案 我正在寻找类似的 Windows 版本 背景 从 S
  • 如何获取 DataSet 作为 Entity Framework 5.0 中查询的结果?

    我不确定这是否可能 我可能尝试使用错误的工具来完成我想做的工作 假设我想要执行以下操作 我执行一个名为 GetTableName 的函数 该函数返回我想要从中获取数据的 SQL 表的名称 我执行另一个名为 GetFields 的函数 该函数
  • jQuery UI ajax 选项卡 - 在选项卡内加载链接时请求成倍增加

    我正在使用 jQuery UI 选项卡 通过 ajax 加载选项卡内容 内容可能包含我想要在所选选项卡中加载的链接 为了实现这一点 我使用这段代码 tab div tabs load function event ui a not targ
  • 修改函数参数

    很抱歉 如果这是一个愚蠢的问题 但我已经寻找了一段时间并没有真正找到答案 如果我正在编写一个 python 函数 例如 def function in1 in2 in1 in1 1 in2 in2 1 我该如何坚持这些改变 我知道他们为什么
  • 如何映射嵌套的复杂JSON对象并将它们保存到核心数据?

    我在将复杂的嵌套 JSON 数据映射和保存到核心数据对象时遇到问题 它用于在离线模式和缓存的情况下读取数据 JSON也有代码 它代表代码列表中对象的id JSON 中对象的嵌套深度可以在 5 8 个对象之间 此类 简化的 JSON 的示例如
  • 在 iOS 上缩小图像最节省内存的方法是什么?

    在后台线程中 我的应用程序需要从磁盘读取图像 将其缩小到屏幕大小 1024x768 或 2048x1536 并将其保存回磁盘 原始图像大部分来自相机胶卷 但其中一些可能具有更大的尺寸 例如 3000x3000 随后 在不同的线程中 这些图像
  • PassportJs 身份验证无限循环和执行(默认)查询

    我正在尝试使用 PassportJs 和 Sequelize 构建身份验证系统 我自己制作了注册系统 使用Sequelize 我只想使用 PassportJS 进行登录 它不会将我重定向到 failureRedirect 路由 也不会重定向