[英]passport authentication failed in basic example
我试图将这个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 的所有用户都可能会遇到“缺少凭据”的问题,因为POST 数据默认不被解析。 要修复它,请安装 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 或登录页面是什么样的? 在您的帖子中,您需要确保至少在正文中发送一些包含username
和password
字段的内容。 如果您发送没有这些信息的帖子,您将收到Missing credentials
错误消息。 如果您想更改这些,您可以修改本指南中显示的参数。
您可以通过添加一个捕获登录错误的路由来自己检查这一点,并在调用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');
}
我已经修改了您的示例以添加必要的表单。 此外,如果有任何错误,则会在登录页面上呈现。 例如,如果您只输入用户名而不是密码,您将看到“缺少凭据”错误消息。 希望这可以帮助!
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);
对于仍然收到此错误的任何人,请仔细检查您发送的字段确实是username
& password
。 如果没有,您需要按照文档中的建议传入额外的参数。 例如
passport.use( new passportLocal({
usernameField: 'email',
passwordField: 'passwd'
}, func..));
我认为现有的答案没有明确解释这个问题:如果缺少req.body.username
和req.body.password
Passport Local Strategy 会抱怨缺少凭据。
通常的错误是 POST 数据没有被解析,这可以通过使用body-parser
来修复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.