Skocz do zawartości
Pecetowicz Forum komputerowe

Autoryzacja userów przez zapytania z aplikacji


Przejdź do rozwiązania Rozwiązane przez aXenDev,

Rekomendowane odpowiedzi

  • Administrator

Hejka. Robię research bo padł w pracy pomysł na pewną apkę. Ze stroną warstwy dla usera nie będzie problemów bo oprę wszystko na Electronie (JS), gorzej z warstwą aplikacji a bardziej autoryzacją userów (PHP).

Niestety zaawansowany Back-end nie jest moją silną stroną (choć staram się pojąć i szkolić w tej czarnej magii) stąd pytanie jak poprzez zapytanie z apki logować i autoryzować użytkownika w wykonywaniu różnych zapytań. Czytałem, że najlepszym sposobem byłby JWT token ale to również mnie przerasta (choć trochę na ten temat czytałem to nie do końca go rozumiem).

Całość względnie będzie prosta bo ma być paru użytkowników (jak się uda to też adminów), którzy przez apkę będą wykonywali głównie proste zapytania. Back-end będzie miał za zadanie:

  • logować i autoryzować uprawnienia usera (no i tutaj mam z tym problem bo nie wiem jak się za to zabrać i zrobić stricte zapytania z apki)
  • tworzyć, aktualizować dane usera (na razie jako oddzielne pliki JSON [bez wrażliwych danych] dla każdego usera, które traktuję jako cache dla apki z której zaciągane są dane)
  • generować grafiki i je aktualizować (to się udało dzięki PHPImage)

Także byłbym wdzięczny co do wskazówek jak poprawnie wykonać logowanie oraz autoryzację userów poprzez API.

Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Ekspert
  • Rozwiązanie

Logowanie:

  1. Sprawdzasz czy masz w pliku konfiguracyjnym klucz do szyfrowania hasła, jeśli nie zwróć błąd,
  2. Sprawdzasz czy metoda jest na pewno POST oraz zabezpieczenie że można request wykonać tylko przez http (czyli przeglądarkę),
  3. Pobierasz dane od klienta z formularza (email, hasło),
  4. Walidujesz czy email to na pewno email i hasło spełnia minimalne wymogi bezpieczeństwa (Możesz to zrobić np. przez REGEX),
  5. Sprawdzasz czy istnieje w bazie danych użytkownik o takim mailu, jeśli nie zwróć błąd o niepoprawnych danych,
  6. Walidacja hasła z szyfrowaniem (Może być za pomocą bcrypt w NodeJS, dla PHP musisz sobie znaleźć bo nie robiłem tego w php), jeśli walidacja hasła nie powiodła się, zwróć błąd o niepoprawnych danych,
  7. Generuj unikalny kod CSRF np. za pomocą JWT i zwróć ten kod przy poprawnym logowaniu (Warto jest też go trzymać na serwerze).

Autoryzacja (Tworzysz nowy endpoint, który sprawdza klucz CSRF np. z cookies lub local-storage):

  • Pobierasz CSRF od klienta i sprawdzasz czy istnieje w bazie danych, jeśli nie zwróć błąd

Podałem Ci kroki jak ja to robię aktualnie w kilku moich projektach, jestem na temacie dyskusji jeszcze jak najbezpieczniej przechowywać klucz CSRF i połączyć to z odszyfrowaniem JWT. Z tego co słyszałem to jeżeli mam JWT to nie potrzebuję endpointu do autoryzacji (Ale jakoś nie chce mi się wierzyć i szukam argumentów dlaczego XD).

Cały czas badam ten temat, jak dowiem się coś więcej to również tutaj napiszę.

  • Lubię to! 2
  • Super 1
Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tworzysz endpoint, gdzie postem przesylasz username/password, który zwróci ci JWT access token lub access token i refresh token/ Analogicznie potrzebne jest stworzenie endpointu, który zwroci nowy access token na podstawie refresh tokena. Poniewaz access token powinenen miec dosc krótki czas przez, który jest aktywny aby poprawic bezpieczeństwo. A w celu autoryzacji poprostu access token przesyłasz w nagłówku Authorization np. jako Bearer token.

Edytowane przez Jacek Floryda
  • Lubię to! 4
Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poczytaj sobie o Laravelu wystawienie tam API i autoryzacja jest banalna i nie musisz pisać całej struktury od nowa a zyskasz dzięki Laravelowi (+ obszerna dokumentacja) duże możliwości rozwoju takiej aplikacji Laravel + bearer token.

Jeśli czujesz się bardziej w js używając typescript to do postawienia takiego API mogę ci polecić NestJS.

Do testowania API polecam ci narzędzie Postman.

  • Lubię to! 3
  • Dzięki! 1
Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Ekspert

Wg najnowszego hype'a 😄 to: https://symfonycasts.com/screencast/api-platform-security

A wg tego jak robiło się kiedyś, to Symfony skeleton + https://symfony.com/doc/current/security.html + https://symfonycasts.com/screencast/symfony-rest4. Trochę trzeba się będzie napisać, ale jak już będziesz mieć core, to sam CRUD powstanie szybko.

  • Lubię to! 1
  • Dzięki! 1
Odnośnik do odpowiedzi
Udostępnij na innych stronach

Co do szyfrowania haseł polecam tę funkcję password_hash natomiast do walidacji hasła password_verify.

$haslo = password_hash('HASLO', PASSWORD_BCRYPT);
print($haslo);

Walidacja hasła

$haslo_z_formularza = 'Haslo';
$haslo_z_bazy = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify($haslo_z_formularza, $haslo_z_bazy)) {
    echo 'Hasło poprawne.';
} else {
    echo 'Hasło nieprawidłowe.';
}

 

Edytowane przez RiV
  • Lubię to! 1
Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • 1 miesiąc później...
W dniu 30.07.2021 o 13:13, aXenDev napisał:

Walidacja hasła z szyfrowaniem

Haseł się nie szyfruje, tylko hashuje.

W dniu 30.07.2021 o 13:13, aXenDev napisał:

Generuj unikalny kod CSRF np. za pomocą JWT i zwróć ten kod przy poprawnym logowaniu (Warto jest też go trzymać na serwerze)

JWT i CSRF token to dwie różne rzeczy. Tokenów jwt nie trzyma się na serwerze, bo nie ma to sensu.

W dniu 30.07.2021 o 13:13, aXenDev napisał:

Podałem Ci kroki jak ja to robię aktualnie w kilku moich projektach, jestem na temacie dyskusji jeszcze jak najbezpieczniej przechowywać klucz CSRF i połączyć to z odszyfrowaniem JWT. Z tego co słyszałem to jeżeli mam JWT to nie potrzebuję endpointu do autoryzacji (Ale jakoś nie chce mi się wierzyć i szukam argumentów dlaczego XD).

Założenie JWT jest takie że: user wysyła dane logowania do określonego serwisu autentykacji (A) który waliduje poprawność tych danych i zwraca podpisany JWT. Za pomocą tego tokena user autoryzuje się w innym serwisie (B), który waliduje czy token jest ważny i wygenerowany przez serwis (A) (poprawnie podpisany). Na podstawie tego może udostępnić dane które wymagają autoryzacji.

Dlatego istnieje określony czas ważności tokenu oraz jego odświeżanie. Ponieważ raz otrzymany token od serwisu A, może być użyty do autoryzacji w serwisie B aż do czasu jego wygaśnięcia. Nawet jeżeli user w serwisie A, został usunięty i nie powinien mieć prawa dostępu do serwisu B. Serwisy B i A nie komunikują się między sobą w celu weryfikacji poprawności sessji usera.

  • Lubię to! 3
  • Super 1
Odnośnik do odpowiedzi
Udostępnij na innych stronach

Problem wciąż nierozwiązany? Dodaj swoją odpowiedź

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto. Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...