2014-05-07 10 views
5

Jestem eksperymentowanie z Passportjs i kod niestandardowy zwrotna jest:Zrozumienie Passportjs niestandardowy oddzwanianie

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

Jestem zadowolony ze wszystkimi tego kodu wyjątkiem przedostatnia linia (req, res, next); - mógłby ktoś wytłumaczyć dlaczego te parametry są dodawane na końcu. Jest to prawdopodobnie bardziej pytanie JS niż pytanie paszportowe, ale jakakolwiek pomoc jest doceniana.

+0

To także pytanie paszportowe. Najwyraźniej "passport.authenticate (...)" zwraca funkcję. – Bergi

+1

Wygląda na to, że został napisany jako 'app.get ('/ login', passport.authenticate ('local', function (err, user, info) {...}));' – Bergi

Odpowiedz

2

można przepisać bez funkcji anonimowej lub zwyczaj oddzwaniania. Wystarczy użyć funkcji paszportowej passport.use(new LocalStrategy()), aby utworzyć nową strategię. See 'Configure' docs.

passport.use(new LocalStrategy(
    function(username, password, done) { 
    logIn({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

Jedyną zmianą trzeba zrobić jest przenieść funkcję logIn być w tym pliku, a nie metoda req. Następnie można po prostu zadzwonić passport.authenticate tak:

app.get('/login', passport.authenticate('local', { successRedirect: '/', 
                failureRedirect: '/login' })); 

Więc zamiast korzystania res.redirect w zwrotnego, po prostu użyć wbudowanego w paszport successRedirect i failureRedirect właściwości. Możesz także zobaczyć ich dokumenty, na authentication page.

+0

Wygląda na to, że w twoim przykładzie jesteś brakuje (req, res, next). Jak wywołać res.redirect() bez nich? Bardzo podoba mi się twoja odpowiedź, ponieważ mam wspólny oddzwonienie, którego chcę użyć. – Chris

+0

@ Chris zaktualizował odpowiedź, aby działała lepiej. Prawdopodobnie nie powinieneś używać wywołania zwrotnego, ale zamiast tego użyć rzeczywistej funkcji uwierzytelniania, aby wykonać całą pracę. Czy to Ci pasuje? – Kostia

+0

Dzięki za regulację, ale w rzeczywistości to właśnie próbowałem uciec. :) Używam tego dla uwierzytelnienia API i nie chcę przekierowywać. Używam go, aby dostosować moją odpowiedź API z poprawnym kodem odpowiedzi, a także przekazać wiadomość z moją odpowiedzią. – Chris

0

Połącz/ekspresowe funkcja middleware ma podpis:

function(req, res, next) 

passport.authenticate() mogą być stosowane jako warstwy pośredniej, np:

app.post('/login', passport.authenticate('local'), nextMiddleware); 

Oznacza to authenticate() zwraca obiekt funkcji middleware, które można wywołaj z parametrami (req, res, next), aby kontynuować cykl żądanie-odpowiedź aplikacji.