Hejto.pl
Motyw strony
Dodaj post

Wpis użytkownika qarmin w Programowanie

Twórca

w Programowanie

3piorunów

Potrzebuję stworzyć prosty system logowania do serwera i dostępu do jego zasobów, który oczywiście powinien być bezpieczny, ale w miarę łatwo implementowalny.

Jako że nigdy się w aplikacjach warstwą sieciową nie zajmowałem, to mam problem ze znalezieniem odpowiedniej metody.

Na internecie jest masa poradników jak to zrobić, ale oczywiście dotyczą różnych frameworków jak i różnych metod(tokeny, sesje), więc akurat nie wszystko kojarzę.

Z tego co wnioskuję logika powinna wyglądać w ten sposób:

* W bazie użytkownika zostaje dodane login + posolone hasło
* Użytkownik próbuje zalogować się do serwera, więc w zapytaniu przesyła w body login + hasło
* Serwer weryfikuje czy w bazie dane się znajdują, jeśli tak, to generuje token przy pomocy sekretnego klucza, w którym wewnątrz jest zapisany login użytkownika i czas wygaśnięcia i zwraca go użytkownikowi
* Użytkownik otrzymuje klucz i następnie do każdego zapytania api dodaje go do nagłówka Authentication
* Serwer po otrzymaniu zapytania, sprawdza nagłówek i odpakowywuje login i czas wygaśnięcia tokena, jeśli token jest ciągle ważny, to wykonuje daną operację, jeśli nie to zwraca błąd
* Serwer dla każdego zapytania wymaga tego tokena(oczywiście oprócz resta do logowania)

Czy moje rozumowanie jest poprawne?

Komentarze (17)

Osobistość0piorunów

A czy komunikacja jest szyfrowana (HTTPS, nie http)? Bez tego logowanie i autoryzacja nie ma sensu.

Gruba ryba0piorunów

@qarmin najprostszy i najbezpieczniejszy dostęp do serwera to klient SSH, z zablokowanym dostępem innym niż przez klucz. Ale ty piszesz o aplikacji webowej. Jeśli chcesz zapewnić dostęp do serwera za pomoacą aplikacji webowej, to zasoby które udostępni serwer będą ograniczone tylko do tego co wystawia aplikacja za pomocą interfejsu. Musisz się zastanowić co chcesz udostępnić, a potem pomyśleć o sposobie realizacji bo aplikacja to jeden ze sposobów. Poza tym jest wiele różnych darmowych aplikacji serwerowych do różnego typu zasobów. Filmy, pliki, Smart Home i różnego rodzaju czujniki, konsolowe sesje dostępowe. W zasadzie to co potrzeba?

Gruba ryba0piorunów

@qarmin no to masz w springu np. moduł security i jak masz "serwer side rendering" to załatwia całą autoryzację, tokeny, klucze, szyfrowanie. Jeśli nie preferujesz żadnej konkretnej technologii to java jest spoko. Ale myślę z każdy wiodący framework webowy będzie kompleksowo obsługiwał sesje logowania. Django w pythonie na przykład, a w PHP to w sumie nie wiem co się teraz używa. Kiedyś używałem codeigniter.

Twórca0piorunów

@DexterFromLab Jako serwer, chodziło mi o serwer dla aplikacji(mobilnej/webowej), udostępniający zasoby do niej i logowanie użytkowników poprzez resty - czyli bardziej o aplikacja do obsługi takich zapytań a nie sprzet/system.

Zawodowiec1piorunów

@qarmin brzmi jak JWT. Domyślnie podpis JWT nie jest sprawdzany, więc twoja w tym głowa by to wymusić. Jak wspomniano wyżej; co złego jest w zwykłej sesji? Będzie najprościej

Zawodowiec1piorunów

@qarmin zależy co rozumiesz pod pojęciem 'wielu serwerów'. Możesz użyć wspólnego, rozproszonego cache do trzymania sesji. JWT ma też swoje problemy. Np. konto zostanie hacknięte i chciałbyś je dezaktywować, a token jest dalej ważny.

Twórca0piorunów

@Meverth Pewnie wychodzę w rozważaniach zbyt daleko, ale czy ciasteczka w przypadku wielu serwerów nie są problematyczne? Skoro jeden serwer otworzył sesję, to drugi raczej o niej nic nie wie i trzeba się bawić w przesyłanie danych o niej pomiędzy nimi(oczywiście jeśli dobrze rozumiem jak to działa).

W przypadku jwt każdy serwer może obsłużyć to zapytanie, bo nic się na nim związanego z tym konkretnym tokenem nie zapisuje

Osobistość2piorunów

@qarmin Supabase https://supabase.com/ to jest chyba teraz najłatwiejsze i najbardziej wszechstronne rozwiązanie onpremowe 😉

Supabase | The Open Source Firebase AlternativeBuild production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.Supabase
Osobistość0piorunów

@qarmin ajjj, no ale kto używa rusta ten sam jest sobie winny 😉 dawaj znać jak postępy. A może stworzysz nawet bibliotekę dla supabase

Fanatyk1piorunów

@zboinek - no i oczywiście działa ze SvelteKit :grinning:

Gruba ryba1piorunów

@qarmin słuchaj, napisz se jak chcesz jak piszesz dla siebie. Jak ktoś Ci się włamie to będziesz bogatszy o doświadczenie.

Twórca6piorunów

@qarmin protip - nie ma nic złego w używaniu zwykłych ciasteczek i sesji... mniej z tym bólu głowy niż z JWT. A najlepiej wziąć jakieś gotowe rozwiązanie, bo zabawa samemu to proszenie się o problemy.

Osobistość0piorunów

Jak chcesz sam implementować JWT to lepiej użyj klasycznych sesji

Twórca0piorunów

@ujdzie A to z tego co widziałem na internecie, to właśnie zwykle częściej jwt był polecany.
Z tego co widzę to implementacja tego w sposób jaki opisałem powinna być w miarę prosta, z ciasteczkami/sesją byłoby łatwiej?

Fenomen6piorunów

@qarmin z grubsza tak, pamiętaj jednak aby użyć dobrej funkcji hashujacej, a nie md5. I poczytaj też jak token (JWT) odpowiednio zakodować z wykorzystaniem klucza prywatnego, tak by nikt nie mógł sobie tego tokena w łatwy sposób podrobić.