2015-11-11 23 views
5

Uczę się uwierzytelniania opartego na tokenie przy użyciu tokenów internetowych JSON i oto, jak widzę to teraz dla aplikacji mobilnej, zbudowanej na przykład z Swift:Uwierzytelnianie na podstawie tokenu z aplikacji mobilnej

  1. mogę utworzyć obiekt wewnątrz aplikacji przy użyciu danych wprowadzonych przez użytkownika, jak

    { nazwa: "patrickbateman" hasło: "ismyknifesharp" rola: "regular", . .. }

  2. Następnie mogę wygenerować z niego token JWT z library.

  3. Następnie wysyłam go do obsługiwanego punktu końcowego API, np. /api/contacts/list. Czy muszę wysłać login/hasło, aby uwierzytelnić się?
  4. Serwer w jakiś sposób sprawdza poprawność tokena. Ale jak? Czy token generowany przez serwer powinien być zapisany w bazie danych i używany jako klucz? Czy muszę generować token na serwerze za każdym razem, gdy otrzymuję żądanie od klienta i porównuję go z tokenem klienta?
  5. Uzyskaj i zarządzaj wszystkimi danymi, których potrzebuję.

Oto moje wnioski:

  1. nie muszę wysłać login/hasło do serwera parę do uwierzytelnienia użytkownika.
  2. Muszę wysłać token za każdym razem, gdy potrzebuję uzyskać dane tylko auth.
  3. Powinienem wdrożyć jakiś algorytm, który zmienia wygenerowany token ze względu na pewne czynniki, takie jak upływ czasu, aby uczynić tokeny expirable.
  4. Powinienem wysłać token wewnątrz nagłówków, ale niekoniecznie tak, jak to się dzieje w treści żądań JSON.

Czy te wnioski są prawidłowe? Jaki jest sposób sprawdzenia tokena wysyłanego przez klienta?

Odpowiedz

1

Moje opinie:

  1. Nie powinniśmy zachować hasło użytkownika na kliencie. Klient powinien wysłać hasło do serwera podczas rejestracji/logowania i nie zapisywać go nigdzie w kliencie. Żądanie powinno być https, a hasło nie powinno być szyfrowane. Szyfrujemy hasło później po stronie serwera.

  2. Serwer wygeneruje dla tego użytkownika token po pomyślnym zalogowaniu użytkownika. Numer token będzie zawierał datę wygasłą. Będziemy używać tokena do uwierzytelnienia uprawnień na serwerze.

  3. Uważam, że każde żądanie do interfejsu API powinno zawierać token, z wyjątkiem rejestracji/logowania/zapomnienia żądań hasła.

  4. Token należy umieścić w nagłówku żądania.

  5. Serwer powinien pozwolić żądania klienta nowy żeton ze starego tokena (może być wygasł)

i odpowiedź na „Jak sprawdzić serwer tokenu od klienta?”. Jest na to wiele sposobów. Sposób poniżej to moje obecne podejście:

Strona serwera generuje token, który jest zaszyfrowanym łańcuchem user info (takim jak czas wygasły tokenu, identyfikator użytkownika, rola ... użytkownika) i hasło (zachowaj tylko na serwerze strona) z algorytmami HMAC lub RSA. Po przesłaniu przez użytkownika token serwer może odszyfrować i uzyskać user info czas wygasania bez sprawdzania z bazy danych.

W każdym razie to pytanie nie dotyczy tagu Swift.

+0

Dlaczego nie jest dobrym pomysłem zachowanie hasła i nazwy użytkownika po stronie klienta? W iOS możemy bezpiecznie przechowywać je w Keychainie? – user805981

+0

Nawet jeśli możemy przechowywać je w bezpieczny sposób, ale nie ma z tego korzyści. Nie powinniśmy używać zapisanego hasła do ponownego logowania. Dobrym sposobem jest praca z tokenem lub wymaga ponownego podania hasła przez użytkownika za pomocą formularza logowania. – t4nhpt

+0

Rozumiem. A jeśli użyjemy jwt i odświeżymy tokeny. Czy powinniśmy ustalić, czy jwt wygasł po stronie klienta przed wysłaniem jakichkolwiek żądań http? A może powinniśmy pozwolić jwt wygaśnięcia i dać 400 z powrotem do klienta przed wprowadzeniem cyklu odświeżania? – user805981

Powiązane problemy