node.js - home - node js server hosting
Pasaporte NodeJS (5)
Añadiendo a la respuesta de Legendre. module.exports = function()
es una forma en nodejs de hacer que un archivo, una variable o una determinada funcionalidad esté disponible globalmente para toda la aplicación.
// anyfile.js
module.exports = function(){
//global code.
}
Configuré el pasaporte en nodejs y lo tengo trabajando con mangosta para permitir a los usuarios iniciar sesión y crear nuevas cuentas.
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'')
}
Mi problema es que el archivo app.js (que es donde el código de pasaporte es) se está haciendo un poco grande y traté de mover las secciones de pasaporte en su propia secuencia de comandos y tener las rutas fuera de la aplicación.js y en su propia auth.js Enrutar archivo y luego hacer referencia a las rutas a través de la aplicación.js. Funciona para otras rutas, pero para las relacionadas con el pasaporte, como iniciar sesión, parece que no activa la función pasaporte.authenicate ().
¿Hay alguna forma de que pueda poner rutas y funciones de pasaporte en su propio archivo y llamarlo / cargarlo desde 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'')
}
}
Este repositorio github también tiene un buen ejemplo de esto.
https://github.com/madhums/nodejs-express-mongoose-demo
El archivo server.js sería tu app.js. Y el /config/passport.js es la configuración de pasaporte incluida.
Esto es lo que hago. Comente si necesita más ayuda para adaptarlo a su código.
Primer paso
Coloque su código de pasaporte en un archivo separado. por ejemplo, pass.js. (Veo que ya ha hecho eso) Luego, en ese archivo, ponga todo el código dentro de esto:
module.exports = function(passport, LocalStrategy){
};
Recuerde agregar a la entrada de función cualquier otra cosa que esté utilizando. En su caso, además del pasaporte y la Estrategia Local, probablemente necesite agregar mongoDbConnection también como entrada.
Segundo paso
En su app.js, incluya esta línea. Justo antes de "app.listen", si es posible, para asegurarse de que todo se haya definido / declarado / incluido correctamente.
require(''./pass.js'')(passport, LocalStrategy);
Explicación
El "contenedor" en el paso uno define el fragmento de código que incluirás en tu aplicación. El "requerir" en el paso dos es el código que realmente lo incluye. Básicamente, se define el archivo completo "pass.js" como una función y se le pasan las herramientas que necesita para llevar a cabo el código (pasaporte, LocalStrategy, etc.)
En su caso, es probable que deba modificar mi código a:
module.exports = function(passport, LocalStrategy, mongoDbConnection){
};
require(''./pass.js'')(passport, LocalStrategy, mongoDbConnection);
Esto debería funcionar. Busqué en Google sobre esto hace un tiempo y esta parece ser la forma "correcta" de romper tu app.js (aunque lo digo con gran inquietud :)). Siéntase libre de comentar si necesita más ayuda.
Para esto, te sugiero que hagas esto en app.js
require(''./mypassport'')(app);
Y 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);
});
});
}
));
}
module.exports = function(app){
passport.serializeUser(function(user, done) {
done(null, user.id);
});
Tal vez no funciona porque no tiene una referencia a un objeto de pasaporte?