authentication - nodejs - npm
Compruebe cada solicitud de node.js de credenciales de autenticación (3)
Otra forma es aplicar una función de middleware. (Ejemplo en CoffeeScript )
# middleware
authKick = (req, res, next) ->
if not do req.isAuthenticated then return res.redirect ''/login''
return do next
# apply
app.use authKick
Esto funcionará en cada solicitud sin tener que tocar las rutas.
Estoy usando node.js con Express y connect-auth para autenticar usuarios.
Esta es la verificación al solicitar / indexar:
if(req.isAuthenticated()) {
res.redirect(''/dashboard'');
} else {
res.render(''index'', { layout: ''nonav'' });
}
Sin embargo, después de cerrar la sesión y regresar a fe ''/ dashboard'', puedo ver el tablero de instrumentos.
¿Cómo puedo poner la verificación de autenticación en cada solicitud para asegurarme de que haya un usuario válido en todo momento?
Actualización No tengo ningún problema con la autenticación, ¡todo funciona bien! Necesito una solución que verifique cada ruta / solicitud si hay un usuario válido, sin poner una función o una instrucción if en la implementación de la ruta, ya que toda la aplicación necesita un usuario válido de todos modos. El ejemplo de autenticación Express utiliza "restringir" en la definición de ruta, que está cerca, pero con muchas rutas puede olvidarse fácilmente.
Puede usar el mecanismo de sessions
provisto por connect
. Coloque este código en app.configure()
para habilitarlo:
app.use(express.cookieParser());
app.use(express.session({
secret: ''some string used for calculating hash''
}));
Después de eso, podrá usar el objeto de req.session
(diferente para cada solicitud) para almacenar sus datos de autenticación (o cualquier otra cosa). Por lo tanto, su código de ejemplo se verá algo así:
if (req.session && req.session.authorized) {
res.redirect(''/dashboard'');
}
else {
res.render(''index'', {layout: ''nonav''});
}
Y la autenticación se verá así:
req.session.authorized = checkPassword(login, passw);
Cerrar sesión:
req.session.destroy();
Más información se puede encontrar here .
app.all(''*'',function(req,res,next){
if(req.isAuthenticated()){
next();
}else{
next(new Error(401)); // 401 Not Authorized
}
});
// NOTE: depending on your version of express,
// you may need to use app.error here, rather
// than app.use.
app.use(function(err,req,res,next){
// Just basic, should be filled out to next()
// or respond on all possible code paths
if(err instanceof Error){
if(err.message === ''401''){
res.render(''error401'');
}
}
});
Si define la ruta completa antes de las rutas que requieren autenticación y después de las rutas que no lo hacen (como la página de inicio, inicio de sesión, etc.), entonces solo debería afectar las rutas que lo necesiten. Alternativamente, podría usar un RegExp en lugar de ''*''
, que incluiría un subpaso o una lista de rutas que requieren autenticación.
Otra opción sería crear una función para incluir en cada ruta que requiera auth:
function IsAuthenticated(req,res,next){
if(req.isAuthenticated()){
next();
}else{
next(new Error(401));
}
}
app.get(''/login'',function(req,res,next){
res.render(''login'');
});
app.get(''/dashboard'',IsAuthenticated,function(req,res,next){
res.render(''dashboard'');
});
app.get(''/settings'',IsAuthenticated,function(req,res,next){
res.render(''settings'');
});