Wylogowanie użytkownika

0

Witak, jak poradzić sobie z wylogowaniem użytkownika w Express.js? Używam jsonwebtoken i token przesyłany jest w header.

7

JWT nie obsługuje konceptu wylogowania - możesz usunąć JWT z localstorage (czy gdzie tam go trzymasz po stronie frontendu) i tyle.

1

JWT ogólnie nie jest najwygodniejszym mechanizmem trzymania sesji, chociaż jak ktoś chce, to da się dookoła niego zaprogramować mechanizmy które to umożliwią.

Co prawda stracisz wtedy pewnie większość zalet JWT, no ale jak teraz tak jest modnie i każdy pierwszy lepszy tutorial pokazuje używanie JWT nawet do scenariuszów gdzie chcesz trzymać sesję użytkownika to co poradzisz :P

1

Zależy czego oczekujesz. W najlepszej wersji przy logowaniu ten token zapisujesz do bazy i przy każdym requeście sprawdzasz dodatkowo czy on jest w bazie a przy wylogowywaniu (które możesz zrobisz też z poziomu panelu admina np jak podejrzewasz przejęcie konta) usuwasz ten token z bazy.

1
rzeznik997 napisał(a):

Witak, jak poradzić sobie z wylogowaniem użytkownika w Express.js? Używam jsonwebtoken i token przesyłany jest w header.

Zapisz w JWT pole logged które ustawiasz na true/false, i jak dostaniesz logged:false od "zalogowanego" usera to traktuj go tak samo jak wylogowanego.

Albo zrób tak jak mówi @Patryk27 i poproś klienta żeby już nie wysyłał tego tokena, np. przez usunięcie go z local storage (zakładając że token nie siedzi tsz w innych miejscach) albo w inny sposób. Zamiast flagi logged true/false można też zrobić logged_until i wstawić timestampa, np +30 minut w przód, jeśli chcemy wylogować usera za jakis czas.

Pamiętaj, żę JWT zostało zrobione z myślą o serverless gdzie nie ma persystencji, więc server nie za bardzo może pamiętać który user jest wylogowany/zalogowany.

PS: Celem wyjaśnienia;

  • Po prostu usunięcie tokena z frontu może nie być wystarczającym zabezpieczeniem, bo jak chcesz "wymusić" to usunięcie tokena w kliencie? Jak server ustawi flagę, to chociaż jest pewne że ten user już więcej nie będzie zalogowany.
1
some_ONE napisał(a):

Ok, czyli tak na prawdę połowiczne wylogowanie na takiej samej zasadzie jak to, że klient usunie token po swojej stronie. W obu tych przypadkach jak ktoś przejmie token to może go dalej używać dopóki nie wygaśnie.

No ale nie masz innej opcji. JWT są zrobione z myślą o serverach bez persystencji, więc jak by to mogło działać inaczej?

Jeśli chcesz zrobić research, to możesz wpisać w google "JWT invalidate token", ale strzelam że jedyne co znajdziesz to albo rady takie jak @Patryk27 pisał, czyli "usuń token w kliencie", albo coś w stylu żeby zrobić krótki czas życia tokenów, np 10-15 minut, i zmieniać je często, że nawet jeśli ktoś przejmie token to krótko go poużywa; albo EWENTUALNIE jakaś forma blacklisty tokenów - że jak user chce się "wylogować" to dodajesz token do blacklisty i jak ktoś chce go użyć jeszcze raz, to jest blocked - ale wtedy JWT traci sens, bo to wymaga jakiejś formy persystencji, i jak już masz coś takiego, to możesz zrobić zwykłą sesje zamiast JWT.

1 użytkowników online, w tym zalogowanych: 0, gości: 1