[英]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.