Javascript Express4和passport:无法进行身份验证
我正在学习javascript和node.js。正如您所知,任何节点应用程序中最重要的部分之一是登录模块,因此我开始使用passport和passport local,但我无法理解passport如何准确地进行身份验证。我对护照认证流程的理解如下,代码如下:Javascript Express4和passport:无法进行身份验证,javascript,node.js,authentication,passport.js,passport-local,Javascript,Node.js,Authentication,Passport.js,Passport Local,我正在学习javascript和node.js。正如您所知,任何节点应用程序中最重要的部分之一是登录模块,因此我开始使用passport和passport local,但我无法理解passport如何准确地进行身份验证。我对护照认证流程的理解如下,代码如下: 'use strict'; var express = require('express'); var app = express(); var passport = require('passport'); var LocalStrat
'use strict';
var express = require('express');
var app = express();
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var dbConfig = require('./settings/db.js');
var mongoose = require('mongoose');
var expressSession = require('express-session');
var flash = require('connect-flash');
mongoose.connect(dbConfig.url);
app.use(expressSession({
secret: 'mySecretKey'
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Admin app started at: %s %s ', host, port);
});
passport.serializeUser(function(user, done) {
console.log('serializing user!');
done(null, 'Hi');
});
passport.deserializeUser(function(id, done) {
console.log('deserializing user');
done(null, {
'_id': 'Hi',
'username': 'shankhs',
'password': 'admin'
});
});
var isAuthenticated = function(req, res, next) {
if (req.isAuthenticated()) {
console.log('Authenticated');
console.log(req);
next();
}
console.log('redirecting to /');
console.log(req.isAuthenticated());
res.redirect('/');
};
app.get('/', function(req, res, next) {
var fileOptions = {
root: __dirname,
dotfiles: 'deny',
headers: {
'x-timestamp': Date.now(),
'x-sent': true
}
};
res.sendFile('login.html', fileOptions, function(err) {
if (err) {
console.log(err);
res.status(err.status).end();
} else {
console.log('send login.html!' + Date.now());
}
});
});
app.get('/admin', isAuthenticated, function(req, res, next) {
var fileOptions = {
root: __dirname,
headers: {
'x-timestamp': Date.now(),
'x-sent': true
}
};
var fileName = 'index.html';
res.sendFile(fileName, fileOptions, function(err) {
if (err) {
console.log(err);
res.status(err.status).end();
} else {
console.log('Send index.html' + Date.now());
}
});
});
passport.use('login', new LocalStrategy(
function(req, username, password, done) {
console.log('using passport!');
console.log(req.body.username);
console.log(req.body.password);
done(null, {
'_id': 'Hi',
'username': 'shankhs',
'password': 'admin'
});
}
));
app.post('/login', function(req, res) {
console.log(req.params);
passport.authenticate('login', {
successRedirect: '/admin',
failureRedirect: '/',
failureFlash: true
})
});
对/login路由的post请求调用异步passport.authenticate调用。
此passport.authenticate将策略作为参数
这个策略被调用,它返回另一个“完成”异步调用,在我的情况下没有错误和用户对象
在“done”调用之后,将调用serializeUser并将页面重定向到/admin
如果有任何后续请求或调用了任何具有isAuthenticated钩子的url,passport.initialize将检查req.passport.user对象是否为空。
如果其为空,则再次重复身份验证过程。
如果不是,passport.session调用passport.deserializeUser,创建req.user对象
我的问题如下:
在“登录”策略中,从不记录这三个:
console.log'usingpassport!';
console.logreq.body.username;
console.logreq.body.password
那么这是否意味着我的“登录”策略永远不会被调用
类似地,从未调用serializeUser和deserializeUser中的console.logs。那么这些函数也没有被调用?
如果我对passport库的理解是正确的,我是否缺少任何要调用的函数
感谢未来的勇士们: 这就是护照的工作原理。有关passport如何工作的详细说明如下: 这里缺少的是对/login的post调用中的bodyparser。您可能认为passport知道如何解析req.body!错误的没有!Express v 4 Forwards body parser必须独立安装,并用作:
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
在post请求中:
app.post('/login', function(req, res, next) {
console.log('in login post!');
console.log('body parsing: ' + req.body.username + ' ' + req.body.password);
passport.authenticate('login', function(err, user, info) {
if (err) {
console.log('passport err: ' + err);
return next(err);
}
if (!user) {
console.log('no user found!');
return res.redirect('/');
}
req.logIn(user, function(err) {
if (err) {
console.log('login error: ' + err);
return next(err);
}
return res.redirect('/admin');
});
})(req, res, next);
});
如您所见,我编写了一个自定义登录回调函数,它比successRedirect和failureRedirect更有意义,并且易于调试。没有主体解析器,自定义函数将无法工作,因为passport不知道如何解析req.body
护照的api文件应该提到这一点!好吧,既然一切都按计划进行,世界现在就有意义了 对于未来的战士: 这就是护照的工作原理。有关passport如何工作的详细说明如下: 这里缺少的是对/login的post调用中的bodyparser。您可能认为passport知道如何解析req.body!错误的没有!Express v 4 Forwards body parser必须独立安装,并用作:
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
在post请求中:
app.post('/login', function(req, res, next) {
console.log('in login post!');
console.log('body parsing: ' + req.body.username + ' ' + req.body.password);
passport.authenticate('login', function(err, user, info) {
if (err) {
console.log('passport err: ' + err);
return next(err);
}
if (!user) {
console.log('no user found!');
return res.redirect('/');
}
req.logIn(user, function(err) {
if (err) {
console.log('login error: ' + err);
return next(err);
}
return res.redirect('/admin');
});
})(req, res, next);
});
如您所见,我编写了一个自定义登录回调函数,它比successRedirect和failureRedirect更有意义,并且易于调试。没有主体解析器,自定义函数将无法工作,因为passport不知道如何解析req.body
护照的api文件应该提到这一点!好吧,既然一切都按计划进行,世界现在就有意义了 最后一行但第二行中的req、res和next是否为必填项?因为,我正在为我的应用程序编写一个本地策略,如果没有它,它似乎无法工作;然而,当我通过它,它的工作!我以前用过passport local,不需要在那里通过,但这次不行!是的,这是必须的。如果我没记错的话,这是调用匿名方法的javascript方式。最后一行但第二行的下一行是必需的吗?因为,我正在为我的应用程序编写一个本地策略,如果没有它,它似乎无法工作;然而,当我通过它,它的工作!我以前用过passport local,不需要在那里通过,但这次不行!是的,这是必须的。如果我没有错的话,那就是调用匿名方法的javascript方式。