2016-01-30 31 views
5

Pracuję z Sails od kilku tygodni, pochodzę z Rails i nie mam żadnego doświadczenia w pracy z Node.js.Jak uzyskać aktualnego użytkownika za pomocą jsonwebtoken w Sails.js?

Teraz próbuję wykonać niezawodne uwierzytelnianie tokenów za pomocą jsonwebtoken. https://github.com/auth0/node-jsonwebtoken

Poszedłem za tym przewodnikiem http://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/ i wszystko działało dobrze. Jestem w stanie dokonać rejestracji, zalogować się, a następnie poprawnie użyć tokena dla różnych akcji.

Teraz są pewne działania, w których chciałbym użyć użytkownika logowania, coś w rodzaju pomocnika devhella current_user. Na przykład podczas tworzenia komentarza ten komentarz powinien należeć do bieżącego użytkownika.

Korzystanie z przewodnika Sabbir Ahmed, w linii 33 z zasady isAuthorized.js token jest odszyfrowywany, dzięki czemu mogę pobrać bieżący identyfikator użytkownika.

Moje pytanie brzmi, jaki powinien być najlepszy sposób na pozyskanie obecnego użytkownika i możliwość późniejszego użycia go w kontrolerze? Na przykład Próbowałem coś takiego:

# isAuthorized.js line 34, after getting decrypted token 
User.findOne({id: token.id}).exec(function findOneCB(err, found){ 
    currentUser = found; 
}); 

Ale na tej drodze, bo jest to działanie asynchroniczny nie mogę użyć tego CurrentUser w kontrolerze.

Chcę zapisać bieżącego użytkownika, aby móc go użyć później w jakimś kontrolerze, bez powtarzania tego samego kodu w każdym kontrolerze, czegoś w rodzaju pomocnika lub usługi.

Odpowiedz

4

Sztuczka polega na umieszczeniu next(). Ponieważ wykonujesz wywołanie asynchroniczne, kontrola powinna zostać przeniesiona do następnej reguły/kontrolera, gdy akcja bazy danych zostanie uruchomiona.

Należy zmodyfikować politykę do:

User.findOne({id: token.id}).exec(function findOneCB(err, found){ 
    if(err) next(err); 
    req.currentUser = found; 
    next(); 
}); 

i powinieneś być w stanie uzyskać dostęp do szczegółów użytkowników w kontrolerach, które używają isAuthorized politykę poprzez req.currentUser

0

Jeśli przez

Na przykład , podczas tworzenia komentarza ten komentarz powinien należeć do bieżącego użytkownika.

co masz na myśli jest pewne atrybuty, takie jak nazwa użytkownika, a kraj itp, zamiast odpytywania bazy danych po weryfikacji, co można zrobić, to wybrać, aby wysłać te dodatkowe atrybuty jwToken.issue w api/controllers/UsersController.js

np.

jwToken.issue({ 
    id: user.id, 
    username: user.name, 
    country: user.country 
    }) 

Jak to pomaga to, że można utrzymać api/policies/isAuthorized.js jak jest, a we wszystkich sterowników, które można używać w przyszłości, można uzyskać dostęp do wartości udźwigu od jak

token.username or token.country 

Zamiast ponownie zapytaj bazę danych, oszczędzając w ten sposób cenny czas odpowiedzi.

Uważaj jednak danych zdecydujesz się wysłać w tokena (można też wysłać {user: user} jeśli chcesz), jednak jako tajnego klucza lub mieszaja nie jest wymagane do odszyfrowania ładowność jako możesz wyczytać @jwt.io, możesz chcieć zachować powściągliwość.