2013-07-24 3 views
5

Dies ist ein komisches. Im Passport 'Lokale Strategie' für meine Express-App und ich komme in eine seltsame Frage.Knoten - Passport Auth - Authed Post Route hängt bei der Formularübergabe

Im Wesentlichen habe ich drei Routen. Jeder hat einen Auth-Check-in.

app.get('/admin', authenticatedOrNot, adminRoute.index); 
app.get('/admin/new', authenticatedOrNot, adminRoute.newpost); 
app.post('/admin/new', authenticatedOrNot, adminRoute.create); 

die authenticatedOrNot Methode ist einfach:

var authenticatedOrNot = function(req, res, next){ 
    if(req.isAuthenticated()){ 
     next(); 
    }else{ 
     res.redirect("/login"); 
    } 
} 

für die Anmeldung an der Admin-Bereich in perfekt funktioniert, und zu überprüfen, ob ein Benutzer angemeldet ist, aber wenn ich senden Sie eine Form an die ‚/ admin/new 'Post Route, der Browser hängt. Nichts passiert in der Konsole, selbst mit console.log an Ort und Stelle:

Ich kann nicht scheinen, es zur Arbeit zu bekommen. Es hängt einfach und scheitert schließlich. Die Browserkonsole sagt nur "ausstehend" in der Netzwerkanforderung.

Ich habe versucht, die "authenticatedOrNot" -Methode aus der Post-Route und das gleiche Problem zu entfernen, aber wenn ich alle drei entfernen, funktioniert es gut.

Ich bin ratlos.

Irgendwelche Hilfe Jungs? Ist noch jemand dazu gekommen?

+0

Passt das Formular zur richtigen Route? Überprüfen Sie in den Entwickler-Tools Ihres Browsers, ob die richtige Route tatsächlich angefordert wird. Sonst sieht der Code gut für mich aus –

+0

Ja, ich habe im Netzwerk eingecheckt. Ich habe es sogar ein bisschen verändert, falls ich verrückt werden sollte. Ein guter Ruf. –

+0

Sind Sie sicher, dass Sie in Ihrer Postroute 'adminRoute.create' eine Antwort zurücksenden? Sie müssen sicher sein, dass Sie die Antwort beenden. – user568109

Antwort

0

Diagnose eines solchen Problems wird viel einfacher, wenn Sie mehr und mehr und mehr teilen ... Beste Vorgehensweise ist es, einige Sniffer (in Chrome, Firefox, Opera oder Standalone) zu verwenden und genau die Header erhalten Sie gesendet zu deinem Server. Dies ist sehr nützlich, da Sie Probleme in der Frontend-App (<form acton="/admin/new" - zum Beispiel vertippen) oder im Backend lokalisieren können.

Lets entschuldigen Sie Ihre Header sind in Ordnung und Sie senden genau POST um /admin/new Route. Da deine console.log(req); nicht wirksam wird, kommt offensichtlich keine Anwendung zu diesem Punkt. Dies könnte sein, weil authenticatedOrNot hängt oder adminRoute.create nicht korrekt instanziiert ist.

authenticatedOrNot könnte auf /login Umleitung hängen wie ich sehe, da Sie nicht die Art und Weise, wie Sie mit dieser Route umgehen.

adminRoute.create könnte einige Probleme verursachen, je nachdem, wie Sie es an Ihre App angeschlossen haben.

Also im Lebenslauf muss ich mehr von Ihrem Code sehen, um das Problem zu etablieren.

1

Ich hatte ein Problem sehr ähnlich, also poste ich das für den Fall, dass es hilft. Das Problem schien zu sein, dass ich eine andere Funktionsdefinition innerhalb der Pass-Funktion hatte, und dies verhinderte, dass der Done-Handler aufgerufen wurde. Ich denke, das war das Problem, denn als ich die Funktionsargumentnamen änderte, begannen die Dinge zu funktionieren.

Im Nachhinein denke ich der Fehler ist offensichtlich, aber da ich neu zu Knoten bin bin ich immer noch ein bisschen unsicher mit Funktionen, Callbacks, Schließungen, etc., usw. Ich habe auch den Eindruck, dass die Knoten Konvention immer ist um diese Argumentnamen zu verwenden (err, done, next) und dass mit ihnen etwas Magie verbunden ist. Ich denke nicht. Fühlen Sie sich frei, mich zu diesem Punkt zu erziehen.

Wie auch immer, ich benutzte eine Passport-Local-Strategie, die ich von einem Tutorial kopiert habe (um http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local). Das Tutorial verwendete mongo, aber ich entschied mich, zu postgresql zu wechseln. Also habe ich den pg benutzt.js-Modul von https://github.com/brianc/node-postgres-pure, und verwendete den mitgelieferten Beispielcode.

Hier ist der relevante Teil des Codes, nachdem ich zunächst den pg.js Beispielcode in den Pass Tutorial kopiert und eingefügt:

// Bad-Code

passport.use('local', new LocalStrategy({ 
    // by default, local strategy uses username and password, we will override with email 
    usernameField: 'email', 
    passwordField: 'password', 
    passReqToCallback: true // allows us to pass back the entire request to the callback 
}, 
function(req, email, password, done) { 
    pg.connect(configDB.connectionString, function(err, client, done) { 
     if (err) { 
      return console.error('could not connect to postgres', err); 
     } 
     client.query('select email, password_hash from admin_user where email = $1', [email], function(err, result) { 

      // check password against db, and then try to call passports done callback 
      return done(null, userModel); // this actually invokes the pg.connect done callback 

     }); 
    }); 
})); 

Also, wenn dies läuft, auf der Post zurück zu/login, der Aufruf zu getan würde aufrufen pg.connect getan, nicht Pass gemacht.

// Gut? Code arbeiten

function(req, email, password, done) { 

    pg.connect(configDB.connectionString, function(err, client, connect_done) { 
     if (err) { 
      return console.error('could not connect to postgres', err); 
     } 
     client.query('select email, password_hash from admin_user where email = $1', [email], function(err, result) { 
      connect_done() // free up postgres connection, which I should have been doing before 
      // check password against db, and then 
      return done(null, userModel); // invoke passport's done callback 

     }); 
    }); 
})); 

Dieser Code jetzt für mich arbeitet (es sei denn, ich etwas falsch kopiert).

Verwandte Themen