2013-06-12 5 views
6

Я пытаюсь разбить этот пример 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); 

ответ

16

Что делает ваш index.html или Войти страницу выглядеть? На вашем посту вам нужно убедиться, что вы отправляете хотя бы что-то в теле с полем username и password. Если вы отправите сообщение без них, вы получите сообщение об ошибке Missing credentials. Если вы хотите изменить их, вы можете изменить параметры, как показано на this guide.

Вы можете проверить это самостоятельно, добавив маршрут, чтобы зафиксировать ошибку входа в систему, и укажите этот маршрут при вызове 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); 
+2

Действительно, его нужно называть 'username'. Я использовал только «имя», отражающее мою собственную схему данных, и это заставляло логин терпеть неудачу каждый раз. Спасибо, +1. –

+0

У меня была опечатка в моем шаблоне ejs, которая обрабатывает вход пользователя. Имя пользователя не было отправлено в сообщении. –

+1

@ArcaneEngineer, это сделало это для меня ...! Спасибо –

23

Всех пользователи нового express.js (4.x и выше) вместе с passport.js может испытать «Missing» верительные грамоты проблемы только потому, что данные POST не разобранные по умолчанию. Чтобы исправить это установить тело-анализатор npm install body-parser и использовать в своем коде:

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

Хороший момент из @ivarni: app.use(bodyParser.urlencoded({ extended: true })); должен быть помещен перед тем инъекционного любой паспорт Middleware.

+0

Абсолютно это. Я просто хотел бы добавить, что 'app.use (bodyParser.urlencoded ({extended: true));' нужно вызывать, прежде чем говорить экспресс использовать паспорт. – ivarni

1

Кому все еще нужна эта ошибка, дважды проверьте поля, которые вы отправляете, действительно username & password. Если нет, вам необходимо передать дополнительные параметры, как предлагается в documentation. Например

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

Я не думаю, что существующие ответы явно объяснить проблему, которая: Passport Local Стратегия будет жаловаться о недостающих учетных данных, если req.body.username и req.body.password отсутствуют.

Часто ошибка заключается в том, что данные POST не были проанализированы и могут быть исправлены с помощью body-parser.

Смежные вопросы