javascript - Node passport-local 策略总是失败

标签 javascript node.js authentication

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

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);
});

类似的问题已通过添加占位符用户序列化/反序列化方法得到解决,但我已经准备好了。

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

curl -X "POST" "http://127.0.0.1:3000/login" \
  --data-urlencode "username=alice" \
  --data-urlencode "password=supersecret"

当我执行该 POST 时,响应每次都包含重定向到 /failure 的 HTTP 302 失败,即使我返回的是 null(无错误),并且LocalStrategy 回调中的虚拟用户对象。我忽略了什么?

最佳答案

我忽略了两件事:

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

现在我在顶部的 require block 包含了这两个缺失的项目,并且在 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 }))

关于javascript - Node passport-local 策略总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30604300/

相关文章:

javascript - foreach 没有循环遍历元素?

javascript - 删除水平条形图中的顶部水平线 (Chart.js 2)

python - Django - 验证错误 "value must be an integer"

Javascript向左或向右双向移位

javascript - 为什么 React 应用程序的生产构建(使用 Webpack 和 Babel)使用错误的开发环境和 HMR,这会导致错误?

node.js - 在以太坊中使用web3js生成地址和私钥

c# - 跨 UWP 应用和 Azure 移动服务的持久身份验证

ios - 检查应用程序是否已购买

node.js - MongoDB更新语句设置其他集合中的值

json - 如何确定 JSON.stringify() 使用哪种编码?