更多Passport.js困境 - 挂起表单提交

 端庄的一白_167 发布于 2023-02-09 22:24

我正在设置我认为可能是最简单的身份验证 - 网站加载在登录屏幕上,用户在表单中输入凭据,提交时我使用Passport.JS和Sequelize来检查凭据.大部分内容都是从各种教程或Passport网站本身复制而来的.无论我做什么,改变或尝试,只要我点击表单提交按钮,网站就会挂起.在开发工具网络选项卡中,我只是将/ login的发布请求显示为待处理.

为了消除所有可能出现的问题,我剥离了Sequelize,并使用了硬编码用户,ala本地使用示例在护照github页面上.尽管如此,没有改变,Sequelize不是问题所在.

我确定这是愚蠢的.我尝试了明显的解决方案,比如确保我的表单发送'用户名'和'密码'.

我的表单看起来像这样:

form(method="post", action="/login")
  fieldset
    legend Please Log In
    label(for="username") Username:
    input#username(type='text', name="username", autocomplete="off")
    label(for="password") Password:
    input#password(type='password', name="password")
    button#login(type="submit") Log In

在节点中我的app.js使用路由器,其中包括:

var login = require('../app/controllers/login');
app.get('/', login.index);
app.post('/login', login.auth);

页面在get请求上加载正常.在帖子上它指向这个:

exports.auth = function (req, res, next) {
  console.log(req.body);
   passport.authenticate('local', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash: true
  });
};

console.log(req.body)很好,显示了表单值,所以我们可以这么做.但没有任何事情.这是最后一部分:

passport.use(new LocalStrategy(
  function(username, password, done) {
    console.log('local strat invoked');
    findByUsername(username, function(err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
      if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
      return done(null, user);
    });
  }
));

我换掉了使用Sequelize的代码,用这个findByUsername函数检查用户的数据库(直接从护照github页面上面提到的帖子复制和粘贴),但是当console.log('local strat invoked')是永远不会出现,在这一点之后,我什么都不猜.

还包括passport.serializeUser和passport.deserializeUser,但我无法想象这些是我被卡住的阶段的问题.

知道我失去了什么步骤让这个工作吗?

1 个回答
  • Passport是中间件,如果将其嵌入到路由处理函数中,则需要调用它:

    exports.auth = function (req, res, next) {
      console.log(req.body);
      passport.authenticate('local', {
        successRedirect: '/home',
        failureRedirect: '/',
        failureFlash: true
      })(req, res, next);  // <-- NEED TO INVOKE WITH req, res, next
    };
    

    或者,更简单地将其用作中间件(这是推荐的方法:

    exports.auth = passport.authenticate('local', {
      successRedirect: '/home',
      failureRedirect: '/',
      failureFlash: true
    });
    

    2023-02-09 22:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有