javascript - Node passport-local-strategin misslyckas alltid


Jag använder Node.js Passport-modulen för att bygga en autentiseringsprocess, och jag kan inte lista ut varför verifieringen alltid misslyckas, även när jag returnerar framgång varje gång från verifieringsåteranropet. För att hålla exemplet enkelt använder jag bara passport-local-strategin utan någon permanent lagring:

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

Liknande frågor har lösts genom att lägga till platshållare för användarserierings-/deserialiseringsmetoder, men jag har redan fått dessa på plats.

Här är ett CURL-anrop för att nå ovanstående med ett användarnamn och lösenord:

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

När jag utför den POSTen innehåller svaret HTTP 302-felomdirigering till /failure varje gång, även om jag returnerar null (inget fel) och ett dummy-användarobjekt i LocalStrategy-callbacken. Vad missar jag?

Svar #1

Jag tittade förbi två saker:

  • Det gjordes inget anrop till passport.initialize()-mellanprogrammet
  • Jag parserade inte förfrågningskroppar eftersom Express inte inkluderar det direkt.

Nu inkluderar mitt require-block högst upp båda dessa saknade objekt, och det returnerar 200 OK när jag POST:ar till /login:

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