Паспорт NodeJS
Я устанавливаю паспорт на nodejs и работаю с mongoose, чтобы позволить пользователям входить в систему и создавать новые учетные записи.
app.js:
var express = require('express')
, app = module.exports = express.createServer()
, passport = require('passport')
, LocalStrategy = require('passport-local').Strategy
, routes = require('./routes/index')(app) //index loads in multiple routes
, MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection;
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({ secret: 'justdoit' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
var mongoDbConnection = new MongoDBConnection();
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
mongoDbConnection.findUserById(id, function(err, user){
done(err, user);
});
});
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
mongoDbConnection.findUser(username, function(err, user) {
//conditions....
});
});
}
));
app.get('/', function(req, res){
res.render('index', { title: "Index", user: req.user });
});
app.get('/account', ensureAuthenticated, function(req, res){
res.render('account', { title: "Account", user: req.user });
});
app.get('/login', function(req, res){
res.render('login', { title: "Login", user: req.user, message: req.flash('error') });
});
app.post('/login',
passport.authenticate('local', {
successRedirect: '/account',
failureRedirect: '/login',
failureFlash: true })
);
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login')
}
Моя проблема в том, что файл app.js(где находится код паспорта) становится немного большим, и я попытался переместить разделы паспорта в свой собственный script и иметь маршруты за пределами app.js и в его собственный файл маршрута auth.js, а затем ссылаются на маршруты через app.js. Он работает для других маршрутов, но для паспортных файлов, таких как логин, он, похоже, не запускает функцию passport.authenicate().
В любом случае я могу помещать паспортные маршруты и функции в свой собственный файл и вызывать его/загружать из app.js?
auth.js:
module.exports = function(app){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
mongoDbConnection.findUserById(id, function(err, user){
done(err, user);
});
});
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
mongoDbConnection.findUser(username, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: 'Unknown user ' + username });
}
if (user.password != password) {
return done(null, false, { message: 'Invalid password' });
}
return done(null, user);
});
});
}
));
app.get('/', function(req, res){
res.render('index', { title: "Index", user: req.user });
});
app.get('/account', ensureAuthenticated, function(req, res){
console.log("directing to the account page....");
res.render('account', { title: "Account", user: req.user });
});
app.get('/login', function(req, res){
res.render('login', { title: "Login", user: req.user, message: req.flash('error') });
});
app.post('/login',
passport.authenticate('local', {
successRedirect: '/account',
failureRedirect: '/login',
failureFlash: true })
);
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login')
}
}
Ответы
Ответ 1
Это то, что я делаю. Пожалуйста, прокомментируйте, если вам нужна дополнительная помощь, адаптирующая его к вашему коду.
Первый шаг
Поместите свой код паспорта в отдельный файл. например pass.js. (Я вижу, вы уже это сделали) Затем в этом файле поместите весь код внутри этого файла:
module.exports = function(passport, LocalStrategy){
};
Не забудьте добавить к функции ввода все, что вы используете. В вашем случае, помимо паспорта и LocalStrategy, вам, вероятно, потребуется добавить mongoDbConnection в качестве ввода.
Второй шаг
В вашей app.js включите эту строку. Как раз перед "app.listen", если возможно, чтобы все было правильно определено/объявлено/включено.
require('./pass.js')(passport, LocalStrategy);
Объяснение
"Обертка" на первом этапе определяет кусок кода, который вы будете включать в свое приложение. "Требовать" на втором шаге - это код, который фактически включает его. Вы в основном определяете весь файл "pass.js" как функцию и передаете ему инструменты, необходимые для выполнения кода (паспорт, LocalStrategy и т.д.).
В вашем случае вам, вероятно, потребуется изменить код:
module.exports = function(passport, LocalStrategy, mongoDbConnection){
};
require('./pass.js')(passport, LocalStrategy, mongoDbConnection);
Это должно сработать. Я искал об этом некоторое время назад, и это, кажется, "правильный" способ разбить ваш app.js(я говорю это с большим трепетом, хотя:)). Не стесняйтесь комментировать, если вам нужна дополнительная помощь.
Ответ 2
Это github repo также имеет хороший пример.
https://github.com/madhums/nodejs-express-mongoose-demo
Файл server.js будет вашим app.js. И /config/passport.js входит в паспортную установку.
Ответ 3
Для этого я предложу сделать это в app.js
require('./mypassport')(app);
А
mypassport.js
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy
, MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection;
module.exports = function(app){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
mongoDbConnection.findUserById(id, function(err, user){
done(err, user);
});
});
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
mongoDbConnection.findUser(username, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: 'Unknown user ' + username });
}
if (user.password != password) {
return done(null, false, { message: 'Invalid password' });
}
return done(null, user);
});
});
}
));
}
Ответ 4
module.exports = function(app){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
Может быть, это не работает, потому что у вас нет ссылки на объект паспорта?
Ответ 5
Добавление к ответу Лежандра. module.exports = function()
- это способ в nodejs сделать файл, переменную или определенную функциональность глобально доступной для всего приложения.
// anyfile.js
module.exports = function(){
//global code.
}