节点护照本地策略总是失败

Col*_*len 5 javascript authentication node.js

我正在使用Node.js Passport模块来构建身份验证过程,我无法弄清楚为什么验证总是会失败,即使我每次从验证回调中都返回成功.为了使示例简单,我只使用护照本地策略而没有持久存储:

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var express = require('express');
var server = express();

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

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

passport.use(new LocalStrategy(
  function (username, password, done) {
    // Would perform lookup and verification here.
    // Instead return a valid user object every time.
    var user = { username: username };
    return done(null, user);
  }
));

server.post('/login', passport.authenticate('local', { failureRedirect: '/failure' }), function (req, res) {
  res.send('access granted');
});

var port = process.env.PORT || 3000;
server.listen(port,  function() {
  console.log('Listening on port ' + port);
});
Run Code Online (Sandbox Code Playgroud)

通过添加占位符用户序列化/反序列化方法已经解决了类似的问题,但我已经有了这些方法.

这是一个使用用户名和密码点击上面的CURL调用:

curl -X "POST" "http://127.0.0.1:3000/login" \
  --data-urlencode "username=alice" \
  --data-urlencode "password=supersecret"
Run Code Online (Sandbox Code Playgroud)

当我执行该POST时,响应包含HTTP 302故障重定向到/failure每次,即使我正在返回null(没有错误),并且LocalStrategy回调中有一个虚拟用户对象.我在俯瞰什么?

Col*_*len 6

我忽略了两件事:

  • 没有调用passport.initialize()中间件
  • 我没有解析请求主体,因为Express不包含开箱即用的功能

现在我在顶部的需求块包含两个缺少的项目,并在POST到/login以下时返回200 OK :

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var express = require('express');
var bodyParser = require('body-parser');
var server = express();
server.use(passport.initialize());
//server.use(passport.session()); -- For persistent login sessions
server.use(bodyParser.urlencoded({ extended: true }))
Run Code Online (Sandbox Code Playgroud)