Czy musisz zbudować własny system uwierzytelniania dla aplikacji?
Widziałem wielu programistów zadających pytania typu 'Czy powinienem zbudować własny system uwierzytelniania dla mojej aplikacji?'. Choć odpowiedź nie może być prosta 'Tak' lub 'Nie', chciałbym napisać artykuł, który rozłoży cały proces na czynniki pierwsze i przedstawi zalety i wady, które pomogą Ci podjąć decyzję.
Tło
Widziałem wielu programistów zadających pytania typu 'Czy powinienem zbudować własny system uwierzytelniania dla mojej aplikacji?'. Choć odpowiedź nie może być prosta 'Tak' lub 'Nie', chciałbym napisać artykuł, który rozłoży cały proces na czynniki pierwsze i przedstawi zalety i wady, które pomogą Ci podjąć decyzję.
TL;DR Konieczne jest znalezienie istniejącego rozwiązania, które spełnia Twoje potrzeby, chyba że naprawdę chcesz mieć pełną kontrolę lub wciąż uczysz się programowania.
Wstęp
Jako programista, zbudowałem wiele aplikacji podczas swojej kariery. Niezależnie od języka programowania, zawsze muszę zbudować wspólne podstawy: uwierzytelnianie użytkownika.
Była to znikoma część, ponieważ wszystko było proste 20 lat temu:
- Zaimplementować system rejestracji i logowania za pomocą nazwy użytkownika i hasła.
- Stworzyć mechanizm do utrzymania sesji użytkownika.
- A co z bezpieczeństwem? Odpowiedź to MD5.
To tyle. Potem mogłem skupić się na 'prawdziwym biznesie'. Nie słyszałeś o MD5? Przegapiłeś 'dobre czasy' rozwoju oprogramowania. Obecnie programiści stają przed większymi wyzwaniami podczas budowy systemu logowania.
To brzmi alarmująco, ale pozwól, że omówię to na przykładzie.
Przykład: Księgarnia online
Załóżmy, że próbujesz zbudować księgarnię online z usługą API i aplikacją internetową.
Po pierwsze, należy zdefiniować zakres 'uwierzytelniania'. Auth może być rozumiane jako uwierzytelnianie i autoryzacja, a mają zupełnie różne definicje i przypadki użycia:
Napisałem artykuł CIAM 101: Uwierzytelnianie, tożsamość, SSO aby szczegółowo omówić te koncepcje.
Wybór metody uwierzytelniania
Zaczynajmy od 'uwierzytelniania', którym w naszym przykładzie jest logowanie użytkownika. Oprócz metody nazwy użytkownika i hasła, oto kilka popularnych metod, które ludzie stosują dla lepszej konwersji użytkowników i bezpieczeństwa:
- Bez hasła, tzn. dynamiczny kod weryfikacyjny (poprzez e-mail lub SMS)
- Logowanie społecznościowe (Google, Facebook, etc.)
Wybór metody zależy od decyzji biznesowej, natomiast można przyjrzeć się wysiłkowi technicznemu:
- Dla metody bez hasła, musisz znaleźć dostawcę, który będzie wysyłał kody weryfikacyjne poprzez e-mail lub sms; następnie zintegrować go z Twoją usługą API (może być potrzebne utworzenie nowych API).
- Dla logowania społecznościowego, musisz przestrzegać wytycznych integracyjnych dostawców tożsamości społecznościowych, z którymi chcesz współpracować. Dodatkowo, musisz utworzyć mapowanie pomiędzy identyfikatorami użytkowników Twojej księgarni a identyfikatorem dostawcy tożsamości.
- Na przykład, gdy użytkownik loguje się za pomocą konta Gmail
[email protected]
, możesz połączyć ten adres e-mail z użytkownikiemfoo
w księgarni. Ten proces pomaga Ci zbudować jednolity system tożsamości i pozwala użytkownikowi na modyfikację lub odłączenie swojej tożsamości społecznościowej w przyszłości.
- Na przykład, gdy użytkownik loguje się za pomocą konta Gmail
Projektowanie i implementacja doświadczenia logowania
Po wyborze metod uwierzytelniania, kolejnym celem jest stworzenie płynnego i eleganckiego doświadczenia logowania dla Twoich użytkowników końcowych. Konwersja w tym miejscu jest podstawowa, ale kluczowa dla biznesu, ponieważ jest to naturalny sposób na pozostawienie trwałych danych klienta.
Pracując dla Airbnb, istniał cały zespół poświęcony optymalizacji doświadczenia logowania na różne platformy. Przeprowadzili niezliczoną ilość testów A/B, aby ustalić, które połączenie miało najwyższy współczynnik konwersji.
Nie jest to praktyczne, kiedy biznes dopiero się rozwija. Ale nadal musimy starać się, aby wszystko było w porządku. Na jakich platformach chciałbyś uruchomić księgarnię? Możesz zacząć od mobilnej, internetowej, albo obu. Dokładny projekt zależy od wybranych metod uwierzytelniania:
- Nazwa użytkownika i hasło: Najłatwiejszy - wystarczy kilka pól do wpisania i przycisków.
- Bez hasła: Wprowadź numer telefonu / e-mail, następnie wyślij i zweryfikuj dynamiczny kod.
- Logowanie społecznościowe: Przeczytaj dokumentację od wybranego dostawcy tożsamości społecznościowej, postępuj zgodnie z wizualnym przewodnikiem, obsłuż logikę przekierowania i na końcu połącz tożsamość społecznościową z tożsamością księgarni.
Więcej rzeczy do przemyślenia, aby było lepiej:
- Czy potrzebujesz połączyć proces logowania i rejestracji dla konkretnej metody?
- Czy potrzebujesz opcji 'zapomniałem hasła', aby klienci mogli samodzielnie zresetować swoje hasła?
Jeśli zdecydujesz się na rozwój natywny, klasyczna praca niemalże się podwoi dla każdej dodatkowej platformy.
Bezpieczeństwo i wymiana tokenów
Bezpieczeństwo może być ukrytym lodowcem. Byłoby świetnie, gdybyś znał OpenID Connect lub OAuth 2.0, ponieważ są one szeroko stosowane i przetestowane w praktyce. OpenID Connect jest stosunkowo nowy, ale jest zaprojektowany dla 'uwierzytelniania użytkownika', co świetnie pasuje do księgarni online.
Bez wchodzenia w szczegóły standardów, są jeszcze niektóre rzeczy do przemyślenia:
- Jaka metoda szyfrowania powinna być użyta dla haseł?
- Jak wygląda proces standardowego uwierzytelniania i autoryzacji?
- Jak działa wymiana tokenów (Token dostępu, Token odświeżenia, ID Token, itp.)?
- Jak mogą być użyte klucze podpisu w tokenach i jak można zweryfikować podpis, aby chronić zasoby?
- Jak można zapobiec atakom na klienta i serwer?
W końcu, możesz stworzyć dobre doświadczenie logowania i dostarczyć je swoim klientom.
Model autoryzacji
Jako księgarnia, musisz oddzielić zasoby dla klientów i sprzedawców. Na przykład, klienci mogą przeglądać wszystkie książki, a sprzedawcy mogą zarządzać swoimi książkami na sprzedaż. Na początku wystarczą proste sprawdzenia if-else; jednak, w miarę rozwoju biznesu, możesz potrzebować bardziej elastycznego modelu, takiego jak kontrola dostępu na podstawie ról (RBAC) lub kontrola dostępu na podstawie atrybutów (ABAC).
Napisałem również artykuł CIAM 102: Autoryzacja i kontrola dostępu na podstawie ról dla zilustrowania podstawowych koncepcji autoryzacji i modelu RBAC.
Podjęcie decyzji
Jak widzisz, uwierzytelnianie nie jest problemem 'wszystko albo nic', ponieważ obejmuje wiele elementów technicznych, a Ty lub Twój zespół możecie mieć różne umiejętności techniczne w tych obszarach. Ważne jest, aby podzielić to na mniejsze części, aby lepiej zrozumieć obecną sytuację.
Podjąć decyzję, zadałbym sobie następujące pytania:
- Jak pilny jest projekt?
- Jak dużo wysiłku spodziewam się włożyć w uwierzytelnianie w porównaniu do biznesu?
- Jakie jest pierwszeństwo doświadczenia użytkownika, bezpieczeństwa i utrzymania?
- Części której potrzebuję do pełnej kontroli? Jak dobrze powinienem je znać?
- Jeśli wybiorę jakieś ramy / rozwiązania, czy są one wystarczająco dobre do dostosowania czy rozszerzenia?
- Jeśli biznes rośnie, czy będę musiał wprowadzić nowy model uwierzytelniania?
- Jeśli znajdę odpowiedniego dostawcę, czy jest on wystarczająco bezpieczny do użycia? Czy potrzebuję planu wycofania się, jeśli coś się stanie z dostawcą?
Mając na uwadze te pytania, odkryłem dwa fakty:
- Tworzenie niezawodnego systemu uwierzytelniania jest bardzo skomplikowane.
- Istniejące dostawcy nie mogą spełnić wszystkich wymaganych kryteriów.
Dlatego zdecydowałem się rozpocząć dedykowany projekt (Logto) do uwierzytelniania i zaangażować społeczność open-source od pierwszego dnia.
Mam nadzieję, że ten artykuł Ci pomógł.