it-swarm.com.de

Überprüfen Sie jede node.js-Anforderung auf Authentifizierungsdaten

Ich verwende node.js mit Express und connect-auth, um Benutzer zu authentifizieren.

Dies ist die Überprüfung beim Anfordern von/Index:

if(req.isAuthenticated()) {
  res.redirect('/dashboard');
} else {
  res.render('index', { layout: 'nonav' });
}

Nach dem Abmelden und Zurückkehren zu f.e. '/ Dashboard', ich kann das Dashboard sehen.

Wie kann ich bei jeder Anfrage die Authentifizierungsprüfung durchführen, um sicherzustellen, dass immer ein gültiger Benutzer vorhanden ist?

Update Ich habe keine Probleme mit der Authentifizierung, alles funktioniert gut! Ich brauche eine Lösung, die jede Route/Anfrage überprüft, ob ein gültiger Benutzer vorhanden ist, ohne eine Funktion oder eine if-Anweisung in die Route-Implementierung zu setzen, da die gesamte App trotzdem einen gültigen Benutzer benötigt. Das Express-Authentication-Beispiel verwendet "einschränken" in der Routendefinition, was zwar nahe ist, aber bei vielen Routen leicht vergessen werden kann.

26
Patrick
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');
        }
    }
});

Wenn Sie die all -Route vor Routen definieren, die eine Authentifizierung erfordern, und nach Routen, die dies nicht tun (z. B. Homepage, Login usw.), sollte dies nur die Routen betreffen, die dies erfordern. Alternativ können Sie ein RegExp anstelle von '*' verwenden, das einen Unterpfad oder eine Liste von Pfaden enthält, für die eine Authentifizierung erforderlich ist.

Eine weitere Option wäre das Erstellen einer Funktion, die in jede Route eingefügt werden soll, für die auth erforderlich ist:

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');
});
35
Zikes

Sie können den von sessions bereitgestellten connect-Mechanismus verwenden. Fügen Sie diesen Code in app.configure() ein, um ihn zu aktivieren:

  app.use(express.cookieParser());
  app.use(express.session({
    secret: 'some string used for calculating hash'
  }));

Danach können Sie das req.session-Objekt (für jede Anforderung unterschiedlich) verwenden, um Ihre Authentifizierungsdaten (oder etwas anderes) zu speichern. Ihr Beispielcode sieht also ungefähr so ​​aus:

if (req.session && req.session.authorized) {
  res.redirect('/dashboard');
}
else {
  res.render('index', {layout: 'nonav'});
}

Und die Authentifizierung sieht so aus:

req.session.authorized = checkPassword(login, passw);

Ausloggen:

req.session.destroy();

Mehr Infos finden Sie hier .

5

Eine andere Möglichkeit ist die Anwendung einer Middleware-Funktion. (Beispiel in CoffeeScript .)

# middleware
authKick = (req, res, next) ->
  if not do req.isAuthenticated then return res.redirect '/login'
  return do next

# apply
app.use authKick

Dies funktioniert bei jeder Anfrage, ohne die Routen berühren zu müssen.

0
Nelo Mitranim