我正在学习javascript和node.js.如您所知,任何节点应用程序中最重要的部分之一是登录模块,因此我开始使用护照和本地护照,但我无法了解护照的身份验证方式。我的护照认证过程的理解,下面是代码:Express4和护照:无法验证
'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
})
});
- POST请求/登录路由调用异步调用passport.authenticate。
- 这passport.authenticate需要一个“战略”作为参数
- 这种策略被调用返回(在我的情况)与另一“完成”异步调用没有错误和用户对象
- “完成”通话结束后,serializeUser被调用并且页面被重定向到/ admin
- 如果有任何后续请求或任何具有isAuthenticated钩子的URL被调用,passport.initialize将检查req.passport.user对象是否为空。
- 如果其为空,则认证过程再次重复。
- 如果它不是,passport.session调用passport.deserializeUser它创建req.user对象
我的问题是:
在 '登录' 策略,这三者从未记录:
console.log('using passport!'); console.log(req.body.username); console.log(req.body.password);
那么这是否意味着我的“登录”策略永远不会被调用?
- 类似地,serializeUser和deserializeUser中的console.logs永远不会被调用。所以这些函数也没有被调用?
如果我对护照库的理解是正确的,我是否缺少任何函数调用?
感谢
是'(req,res,next)'在最后一行但是第二行是强制性的?因为,我正在为我的应用程序编写本地策略,如果没有它,它似乎无法工作;但是,当我通过它,它的作品!我早些时候与护照本地人一起工作过,并没有通过它,但没有在这一个! – Akash 2015-09-06 07:29:33
是的,它是必需的。如果我没有错,它调用匿名方法的JavaScript方式。 – 2015-09-08 16:45:24