基本示例中护照authentication失败

我正试图将这个passport.js例子分解为它最基本的元素。 我一直得到401(未经授权)的消息,不知道为什么。 任何帮助将不胜感激。

谢谢!

Node.js文件:

var http = require('http'), express = require('express'), passport = require('passport'), LocalStrategy = require('passport-local').Strategy, flash = require('connect-flash'); var port = process.env.PORT || 8080; passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); }); passport.use(new LocalStrategy( function(username, password, done) { console.log("LocalStrategy working..."); return done(null, { id: 1, username: 'Joe', password: 'schmo'}); } )); var app = express(); app.configure(function(){ app.use(express.static(__dirname + '/app')); app.use(express.cookieParser('big secret')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieSession()); app.use(flash()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); }); app.get('/', function (req, res) { res.sendfile(__dirname + '/index.html'); }); app.post('/login', passport.authenticate('local'), function (req, res) { console.log("authenticated...."); res.end(); }); app.listen(port); 

所有使用express.js(4.x及更高版本)和passport.js的用户都可能因为缺省情况下未parsingPOST数据而遇到“Missing credentials”问题。 为了解决这个问题,安装body-parser npm install body-parser并在你的代码中使用:

 var bodyParser = require( 'body-parser' ); app.use( bodyParser.urlencoded({ extended: true }) ); 

从@ivarni的好处: app.use( bodyParser.urlencoded({ extended: true }) ); 必须注入任何护照中间件之前放置。

你的index.html或login页面是什么样的? 在你的post上,你需要确保你至less发送了一些usernamepassword字段。 如果您发送没有这些信息的post,您将收到Missing credentials错误消息。 如果要更改这些参数,可以按照本指南中的说明修改参数。

您可以通过添加路由来捕获login错误,并在您的passport.authenticate调用中指定该路由。

 app.post('/login', passport.authenticate('local', { failureRedirect: '/loginerror', failureFlash: true }), function(req, res) { res.redirect('/'); }); app.get('/loginerror') function(req,res) { console.log(req.flash('error')); res.redirect('/login'); } 

我修改了你的例子来添加必要的表单。 另外,如果有任何错误,则会在login页面上呈现。 例如,如果您只input用户名而不input密码,则会看到“缺less凭据”错误消息。 希望这可以帮助!

 var http = require('http'), express = require('express'), passport = require('passport'), LocalStrategy = require('passport-local').Strategy, flash = require('connect-flash'); var port = process.env.PORT || 8080; passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); }); passport.use(new LocalStrategy( function(username, password, done) { console.log("LocalStrategy working..."); return done(null, { id: 1, username: 'Joe', password: 'schmo'}); } )); var app = express(); app.configure(function(){ app.use(express.static(__dirname + '/app')); app.use(express.cookieParser('big secret')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieSession()); app.use(flash()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); }); app.get('/', function(req, res){ var username = "not logged in"; if (req.user) { username = req.user.username; } var body = '<html><body>'; body = body + '<p>' + username + '</p>'; body = body + '<a href="/login">login</a>' body = body + '</body></html>' res.send(body); }); app.get('/login', function(req, res){ var message = req.flash('error'); var body = '<div><p>' + message + '</p></div>'; body = body + '<form action="/login" method="post">'; body = body + '<div><label>Username:</label>'; body = body + '<input type="text" name="username"/><br/></div>'; body = body + '<div><label>Password:</label>'; body = body + '<input type="password" name="password"/></div>'; body = body + '<div><input type="submit" value="Submit"/></div></form>'; res.send(body); }); app.post('/login', passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), function(req, res) { res.redirect('/'); }); app.listen(port); 

对于任何人仍然收到此错误,仔细检查您发送的字段确实是usernamepassword 。 如果不是,则需要按照文档中的build议传递额外的参数。 例如

 passport.use( new passportLocal({ usernameField: 'email', passwordField: 'passwd' }, func..)); 

我不认为现有的答案明确解释了这个问题:如果缺lessreq.body.usernamereq.body.password Passport Local Strategy将会抱怨丢失的证书。

通常的错误是POST数据没有被parsing,并且可以通过使用body-parser