2013-11-26 15 views
81

Jak połączyć paszport-lokalny, aby przywrócić token JWT po pomyślnym uwierzytelnieniu?paszport-lokalny z węzłem-jwt-prosty

Chcę użyć node-jwt-simple i patrząc na passport.js Nie wiem, jak sobie z tym poradzić.

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ 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); 
    }); 
    } 
)); 

Czy można zwrócić token podczas wywoływania done()? Coś takiego ... (tylko pseudokod)

if(User.validCredentials(username, password)) { 
    var token = jwt.encode({username: username}, tokenSecret); 
    done(null, {token : token}); //is this possible? 
} 

Jeśli nie, w jaki sposób mogę zwrócić token?

Odpowiedz

116

Wymyśliłem!

Przede wszystkim musisz wdrożyć poprawną strategię. W moim przypadku LocalStrategy, i musisz podać swoją logikę walidacji. Na przykład sake, użyjmy tego w paszporcie-lokalnym.

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ 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); 
    }); 
    } 
)); 

wywołanie zweryfikować powrotem podać function(username, password, done) zajmie znalezienie użytkownika i sprawdzenie, czy hasło pasuje (poza zakresem pytania i moje odpowiedzi)

passport.js oczekuje kilka kawałków dla niego do pracy, po pierwsze zwraca się użytkownika w strategii. Próbowałem zmienić tę część kodu, a to było złe. Oddzwanianie oczekuje false, jeśli sprawdzanie poprawności zakończy się niepowodzeniem, a object (zweryfikowany użytkownik), jeśli się powiedzie.

Teraz .... jak zintegrować JWT?

W swojej trasie do logowania będziesz musiał obsłużyć udane uwierzytelnienie lub niepowodzenie. I tutaj musisz dodać token JWT. Podobnie jak:

(pamiętaj, aby wyłączyć sesję, w przeciwnym razie będziesz musiał wdrożyć funkcje serializacji i deserializacji, a nie potrzebujesz tych, jeśli nie trwasz w sesji, której nie używasz, jeśli używasz auth żeton based)

przykładów paszportowych lokalnego (z tokenu JWT dodanej)

// POST /login 
// This is an alternative implementation that uses a custom callback to 
// achieve the same functionality. 
app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err) } 
    if (!user) { 
     return res.json(401, { error: 'message' }); 
    } 

    //user has authenticated correctly thus we create a JWT token 
    var token = jwt.encode({ username: 'somedata'}, tokenSecret); 
    res.json({ token : token }); 

    })(req, res, next); 
}); 

I to jest to! Teraz, kiedy wywołujesz/logujesz się, oraz nazwę użytkownika i hasło POST (które zawsze powinny być przez SSL) pierwszy fragment kodu powyżej spróbuje znaleźć użytkownika na podstawie podanej przez ciebie nazwy użytkownika, a następnie sprawdzić, czy hasło pasuje (Oczywiście, że będziesz musiał zmień to w zależności od potrzeb).

Po tej czynności zostanie wywołana twoja trasa logowania i tam możesz zadbać o zwrócenie błędu lub ważnego tokena.

Mam nadzieję, że to pomoże komuś. A jeśli popełniłem jakieś błędy lub coś zapomniałem, daj mi znać.

+2

super, dzięki za komentarz, jak rozwiązać it :) – robertklep

+3

Paszportowa [BasicStrategy] (http://passportjs.org/guide/basic-digest/) lub DigestStrategy to dwie inne opcje. Jednak nie wydaje się, aby istniała ogromna różnica między strategiami podstawowymi i lokalnymi, ponieważ obie sesje nie muszą działać - tylko lokalny prosi o przekierowania (dzięki czemu jest on mniej przyjazny dla interfejsu API). – funseiki

+1

Hej @ cgiacomi mógłbyś podać przykład trasy, która sprawdza token? –

18

Jest to świetne rozwiązanie, po prostu chcę dodać to:

var expressJwt = require('express-jwt'); 

app.use('/api', expressJwt({secret: secret})); 

Lubię używać "express-JWT" do sprawdzania poprawności tokenu .

btw: ten artykuł jest wielki, aby dowiedzieć się, jak radzić sobie token po stronie klienta, korzystając kątowe, aby wysłać go z powrotem z każdego żądania

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

+2

Użyłem tylko 'express-jwt' do uwierzytelniania, ale czytając dokumentację innych pakietów, takich jak 'paszport-jwt', myślę, że będę trzymał się' express-jwt'. Znacznie prostszy, o wiele ładniejszy IMO – bobbyz

+0

Po prostu FYI express-jwt nie zapewnia obsługi odświeżania tokenów. – user3344977