2015-02-09 16 views
15

Mam dwie aplikacje:Utrzymanie tajny klucz i token dostępu do JWT w Express i NodeJS z Facebook w Rest API

  • serwer (REST API serwera)
    • węzła js
    • ekspresowe
    • jsonwebtokens
    • express-jwt
    • mangusta
  • klient (Portable Czołowy)
    • bootstrap
    • Angular JS
    • lokalnego przechowywania
    • kątowe-facebook
    • kątowe-JWT

lateron, aplikacja kliencka zostanie przeniesiona na Androida, iPhone'a i inne platformy za pomocą phon egap. W przypadku OAuth używam Facebooka jako dostawcy. Teraz, po prostu zdałem sobie sprawę, że Jenson Web Token to sposób na zrobienie tego typu konfiguracji. Moje pytanie jest raczej architektoniczne niż syntaktyczne - jak zarządzać tajnym kluczem podczas podpisywania tokenu dostępu facebook i identyfikatora użytkownika z JWT w nodejs?

Tak to jest jak strumień działa w mojej aplikacji:

  1. kątowa klient posiada przycisk Login
  2. użytkownik kliknie przycisk> Facebook Auth zaczyna
  3. Client odbiera user_id i FB Token dostępu
  4. Klient wysyła [POST json body] zarówno ser_id i dostęp Reklamowe do pinowe + Express, Server w 'http://server.com/auth/login'
  5. węzeł serwera zastosował ekspresowej JWT do wszystkich tras z wyjątkiem /auth/login z expressJwt

    var = require ('express-jwt');

    var jwt = require ('jsonwebtoken');

    app.use (expressjwt ({secret: ''}). Unless ({ścieżka: ['/ auth/login']}));

  6. serwer Węzeł odbiera dane z req.body, pobiera wszystkie dane z profilu facebook pomocą JavascriptSDK i znaki go za pomocą

    var znacznik = expressjwt.sign ({profile},);

  7. Server Node sklepów (aktualizacje, jeśli user_id istnieje) nowego tokena w db i przesyła go jako odpowiedź na klienta
  8. klienta zapisuje nowy żeton otrzymaniu danych json w lokalnej-storage
  9. klient używa kątowe-JWT do pobierania danych profilu z nowego tokenu i automatycznie dołączyć nowy token w nagłówku autoryzacji dla wszystkich żądań to wysyła do serwera

Teraz moje pytania to:

  1. Czy naprawdę muszę przechowywać tokeny JWT w bazie danych? Z pewnością nie porównywanie tokenów w nagłówkach żądań z bazą danych
  2. Czy muszę generować losowe tajne klucze dla bezpieczeństwa, za każdym razem, gdy osoba się loguje? Jeśli tak, to w jaki sposób pasowałoby to zarówno do klienta, jak i do serwera?
  3. Kiedy i gdzie należy sprawdzić datę wygaśnięcia tokena? i Jak mogę go odświeżyć?

Jestem trochę zagubiony w kwestii przepływu projektu i mechanizmu.

+0

więc wreszcie teraz, jak to robisz ?? używasz db do przechowywania unieważnionych tokenów lub co? proszę odpowiedzieć musi to będzie bardzo pomocne dla mnie –

Odpowiedz

13

Ad 1. Nie musisz przechowywać JWT w bazie danych. Identyfikator użytkownika może być częścią ładunku, dlatego nie ma takiej potrzeby.

Ad 2. Powszechną praktyką w aplikacjach po stronie serwera jest używanie jednego tajnego klucza do generowania wszystkich JWT.

Ad 3. Sprawdź, czy token wygasł przy każdym żądaniu do interfejsu API i nie zezwalaj na dostęp, jeśli token wygasł, zwróć kod stanu 401. Aplikacja kliencka powinna monitować użytkownika o poświadczenia i zażądać nowych JWT. Jeśli chcesz uniknąć ponownego przesyłania przez użytkowników poświadczeń, możesz wydać token odświeżania, który później może zostać użyty do wygenerowania nowych JWT.

JWT refresh token flow

http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/

+0

Dzięki za odpowiedź. Czy mógłbyś dalej rozwinąć nieco więcej: Co zrobić, jeśli chcę odwołać dostęp do określonego tokena od strony serwera? A jeśli próbuję wygenerować nowy tajny klucz dla każdego użytkownika, dla klienta, czy powinienem je również spakować i przechowywać w pamięci lokalnej, aby odszyfrować nowy token w celu wyodrębnienia informacji z ładunku? –

+0

Po prawidłowym zaimplementowaniu można ufać, że ładunki JWT od użytkowników są danymi _unaltered_, które pierwotnie wysłałeś. Możesz to wykorzystać do unieważnienia tokena: dodaj "prawidłową" flagę do każdego ładunku i wymuś ponowną autoryzację, jeśli jest ustawiona na false. – sedge

+0

tak, ale co, jeśli ktoś wyloguje się, jeśli nie odwołasz tego tokena teraz ktoś inny może użyć tego tokena na całe życie? –

Powiązane problemy