Logowanie i konta w aplikacji dla firmy — Google, e-mail z hasłem czy link jednorazowy?
Logowanie bierze się z bazy, nie pisze się go samemu: konto Google i e-mail z hasłem na start, link jednorazowy dla tych, którzy logują się rzadko. Taki link jest domyślnie ważny godzinę i działa raz. Wbudowana poczta uwierzytelniająca wysyła 2 wiadomości na godzinę, więc własny nadawca podpina się przed pierwszymi klientami.
Warstwy logowania — z czego składa się wejście do aplikacji?
Z sześciu elementów, nie z jednego ekranu: rejestracja, konto Google, hasło z resetem, link jednorazowy, sesja z odświeżaniem i role. Pierwsze cztery użytkownik widzi. Dwa ostatnie rozstrzygają, co zobaczy po wejściu — i to one bywają zrobione po łebkach.
Ta warstwa jest wbudowana w bazę, w której i tak trzymamy dane: jeden Postgres z politykami dostępu na poziomie wierszy i logowaniem użytkowników. To trzecia z czterech warstw aplikacji dla firmy, a nie osobny system obok niej.
Element, który zaskakuje najczęściej, to poczta. Wbudowana usługa pocztowa dostawcy wysyła 2 wiadomości na godzinę, a dokumentacja opisuje ją wprost jako nieprzeznaczoną do produkcji (Supabase, odczyt 31 sierpnia 2026). Potwierdzenie rejestracji, reset hasła i link jednorazowy idą tym samym kanałem.
Po podpięciu własnego nadawcy dostawca ustawia na start 30 wiadomości na godzinę i dopiero tę wartość podnosi się w ustawieniach (dokumentacja, odczyt 31 sierpnia 2026). To liczba, o którą warto zapytać przed zaproszeniem pierwszej setki kont: jedna wysyłka zaproszeń albo się w niej mieści, albo nie.
| Element logowania | Co robi | Typowy wybór | Limit albo domyślne ustawienie (odczyt 31.08.2026) | Co się psuje, gdy tego brak |
|---|---|---|---|---|
| Rejestracja i potwierdzenie adresu | zakłada konto i sprawdza, czy adres w ogóle istnieje | e-mail z linkiem potwierdzającym, wysyłany przez bazę | jedno żądanie potwierdzenia na 60 sekund dla jednego użytkownika | konta z literówką w adresie: klient nie dostaje niczego, a obsługa nie wie, czy wina jest po jego stronie |
| Konto Google | wpuszcza bez zakładania nowego hasła | logowanie Google z zakresami niewrażliwymi: imię i adres e-mail | projekt w stanie „Testing”: do 100 użytkowników testowych, zgoda wygasa po 7 dniach od udzielenia | pilot wygląda na sprawny do pierwszego poniedziałku, potem wszyscy wypadają z aplikacji |
| Hasło i reset | droga dla wszystkich, którzy nie pracują na koncie Google | hasło w bazie plus e-mail resetujący | domyślne minimum 6 znaków, dokumentacja odradza mniej niż 8; blokowanie haseł znanych z wycieków od planu Pro | hasła krótsze, niż ktokolwiek zakładał, bo domyślnego ustawienia nikt nie ruszył |
| Link jednorazowy albo kod z e-maila | wpuszcza bez hasła tych, którzy logują się rzadko | link ważny godzinę, do jednego użycia | jedno żądanie na 60 sekund dla użytkownika, 30 kodów na godzinę w całym projekcie; ważność powyżej doby dokumentacja odradza | użytkownik klika w link z wczoraj, dostaje błąd i dzwoni; obsługa wysyła kolejny, aż skończy się limit |
| Sesja i odświeżanie | trzyma zalogowanie między wizytami | token dostępu z krótką ważnością plus token odświeżający | domyślnie 3 600 sekund, maksimum 604 800 sekund; ograniczenie czasu sesji i wylogowanie po bezczynności od planu Pro | albo wylogowania w środku pracy, albo sesja żyjąca tydzień na cudzym laptopie |
| Role i uprawnienia | rozstrzyga, kto widzi panel administratora | osobna tabela ról plus polityki dostępu na wiersze | bez limitu liczbowego w dokumentacji: to zasada projektowa, nie parametr do ustawienia | każdy zalogowany klient jest administratorem |
Decyzja: logowanie od dostawcy bazy, dwie drogi na start
Logowanie bierzemy stamtąd, skąd bierzemy bazę. Powód nie jest wygodą programisty. Identyfikator zalogowanej osoby musi być tą samą wartością, którą sprawdza polityka dostępu do wiersza — inaczej powstaje druga lista ludzi i tabela sklejająca ją z pierwszą.
Ta druga lista jest miejscem, w którym awarie robią się drogie. Ktoś zmienia adres w jednym systemie i nie zmienia w drugim. Konto skasowane w jednym miejscu zostaje w drugim. Każdy taki rozjazd kończy się ręcznym grzebaniem w danych, zwykle pod telefon klienta.
Alternatywy są dwie. Własny mechanizm logowania: trzeba w nim napisać reset hasła, blokady po nieudanych próbach, drugi składnik i unieważnianie sesji, a potem to utrzymywać. Osobny dostawca tożsamości jako trzecia usługa: sensowny, gdy firma ma już jedno logowanie do kilku systemów; przy jednej aplikacji dokłada tylko sklejanie.
Drogi dla użytkownika ustawiamy dwie, bo jedna zawsze kogoś odcina. Konto Google działa dla firm pracujących na Gmailu i zdejmuje z aplikacji cały temat haseł. E-mail z hasłem jest dla reszty, a reszty jest sporo: poczta na własnej domenie nie musi stać na Google.
Trzecia droga, link jednorazowy, jest dla tych, którzy logują się rzadko: raz na kwartał po raport, raz w roku po dokument. Oni i tak zapomną hasła, więc reset stałby się ich normalną drogą wejścia. Lepiej dać ją wprost, z ważnością godziny i jednym użyciem.
Co zmienia skala: 10, 1 000 i 10 000 kont?
Trzy rzeczy, w kolejności, która zaskakuje: najpierw ekran zgody Google, potem poczta, a rachunek za samo logowanie na końcu albo wcale. Limit aktywnych użytkowników w darmowym planie bazy to 50 000 miesięcznie (cennik Supabase, odczyt 31 sierpnia 2026) — nie on wypycha aplikację z planu.
Przy dziesięciu kontach pilotażowych rozstrzyga stan projektu w Google. Dopóki jest ustawiony na „Testing”, korzysta z niego najwyżej 100 użytkowników testowych, a ich zgoda wygasa po siedmiu dniach od udzielenia (dokumentacja Google Cloud, odczyt 31 sierpnia 2026). Publikacja projektu zdejmuje oba ograniczenia.
Samo logowanie nie wymaga weryfikacji aplikacji, dopóki prosi wyłącznie o zakresy niewrażliwe, czyli imię i adres e-mail (dokumentacja Google Cloud, odczyt 31 sierpnia 2026). Weryfikacja marki służy do czego innego: żeby na ekranie zgody stanęła nazwa i logo firmy, a nie surowy adres.
Przy tysiącu kont kończy się poczta i to jest pierwszy prawdziwy próg. Potwierdzenie rejestracji, reset hasła i link jednorazowy to trzy wysyłki do jednej osoby w ciągu jednego dnia. Wbudowana usługa daje 2 wiadomości na godzinę, własny nadawca startuje z 30 (dokumentacja, odczyt 31 sierpnia 2026).
Przy dziesięciu tysiącach kont zaczyna się rachunek, ale nie za logowanie. Plan Pro kosztuje od 25 USD miesięcznie i zawiera 100 000 aktywnych użytkowników, powyżej 0,00325 USD za użytkownika (cennik, odczyt 31 sierpnia 2026). Plan płatny odblokowuje za to dwa ustawienia, które przy tej skali są potrzebne.
Pierwsze to ograniczenia sesji: maksymalny czas jej życia i wylogowanie po bezczynności, dostępne od planu Pro. Drugie to blokowanie haseł znanych z wycieków, też od planu Pro (dokumentacja, odczyt 31 sierpnia 2026). Oba dotyczą kont pracowników, nie klientów — i oba włącza się raz.
Gdzie logowanie się wykłada — cztery pułapki z praktyki
Błąd 500 z pustym komunikatem. Klient logowania potrafi zwrócić kod 500 bez treści. Awaria wygląda wtedy jak „coś nie działa” i nie da się jej odróżnić od literówki w konfiguracji.
Reguła: logujemy pełną odpowiedź serwera, nie sam kod. Bez tego pierwsze pytanie po zgłoszeniu brzmi „a co dokładnie odpowiedział serwer”, i nie ma na nie odpowiedzi.
Identyfikator w adresie to nie hasło. Link „bez logowania” do faktury albo raportu, w którym da się podmienić numer, otwiera cudze dane każdemu, kto ten numer zgadnie.
Reguła: takie linki dostają token z terminem ważności i zakresem. Link jednorazowy z logowania jest tym samym wzorcem zrobionym porządnie: ważny godzinę, do jednego użycia.
Zalogowany to nie administrator. Uprawnienie administratora sprawdzamy po identyfikatorze użytkownika w osobnej tabeli ról, nigdy po samym fakcie zalogowania.
Co z tego wynika dla polityk dostępu do wierszy, rozpisuje osobny tekst: zasady bezpieczeństwa od pierwszego dnia.
Wylogowanie nie działa natychmiast. Dokumentacja mówi wprost: tokeny dostępu unieważnionych sesji pozostają ważne do końca swojego czasu ważności (Supabase, odczyt 31 sierpnia 2026).
Przy domyślnej godzinie znaczy to, że przycisk „wyloguj wszystkie urządzenia” działa z opóźnieniem. Reguła: przy kontach sięgających po cudze dane skracamy ten czas i sprawdzamy uprawnienie po stronie serwera.
Po czym poznać, że logowanie jest ustawione dobrze?
Po czterech odpowiedziach, których nie trzeba szukać w kodzie. Każde „sprawdzimy” znaczy, że ta warstwa nie jest gotowa do startu.
- Czy wiadomości z logowania wychodzą z domeny firmy, czy z wbudowanej usługi dostawcy z limitem 2 na godzinę?
- Ile trwa ważność linku jednorazowego i czy da się go użyć drugi raz?
- Po czym aplikacja poznaje administratora: po tabeli ról czy po tym, że ktoś jest zalogowany?
- Co dzieje się po kliknięciu „wyloguj na wszystkich urządzeniach” i po jakim czasie stary token przestaje otwierać dane?
Ostatnie pytanie jest najlepsze, bo odpowiedź „natychmiast” bez wskazania ustawienia znaczy, że nikt tego nie sprawdzał. Konta, hasła i ekran zgody poprawia się w jeden dzień. Sesje i uprawnienia trzeba przemyśleć raz, na początku — potem zmienia się je razem z danymi, które już istnieją.
Najczęstsze pytania
Czy wymagać logowania dwuskładnikowego?
Na kontach administracyjnych tak, na kontach klientów zwykle nie. Dostawca bazy obsługuje dwie metody drugiego składnika: aplikację generującą kod czasowy i kod wysyłany wiadomością na telefon (dokumentacja, odczyt 31 sierpnia 2026). Próby weryfikacji drugiego składnika są ograniczone do 15 na godzinę z jednego adresu, więc atak na oślep nie ma jak działać.
Co zrobić z kontem pracownika, który odchodzi?
Dezaktywować, nie kasować: konto trzyma ślad, kto zatwierdzał i zmieniał dane. Wylogowanie globalne kończy wszystkie sesje, ale tokeny dostępu unieważnionych sesji pozostają ważne do końca swojego czasu ważności — domyślnie godziny (dokumentacja, odczyt 31 sierpnia 2026). Usuwanie danych osobowych to osobna procedura: RODO w aplikacji dla firmy.
Czy dodawać logowanie przez Facebooka albo Apple?
W aplikacji webowej to decyzja o wygodzie. W aplikacji z App Store to reguła: program, który używa logowania społecznościowego do konta głównego, musi udostępnić równorzędną drogę ograniczającą zbieranie danych do imienia i adresu, z możliwością ukrycia adresu (wytyczne recenzji Apple, punkt 4.8, odczyt 31 sierpnia 2026). Kiedy sklep jest w ogóle potrzebny, rozstrzyga porównanie PWA i aplikacji natywnej.
Co dzieje się z sesją po zmianie hasła?
Zmiana hasła bez ponownego uwierzytelnienia jest możliwa, dopóki sesja powstała w ciągu ostatnich 24 godzin; przy włączonej bezpiecznej zmianie hasła użytkownik dostaje jednorazowy kod do potwierdzenia (dokumentacja, odczyt 31 sierpnia 2026). Czy sama zmiana hasła kończy pozostałe sesje, nie znaleźliśmy w dokumentacji na dzień 31 sierpnia 2026 — to pytanie do wykonawcy przed odbiorem.
Czy klient może wejść do aplikacji bez zakładania konta?
Może, jeśli dostanie link z tokenem, który ma termin ważności i zakres — czyli dokładnie to, czym jest link jednorazowy: ważny godzinę i do jednego użycia (dokumentacja, odczyt 31 sierpnia 2026). Czym taki link nie jest: adresem z identyfikatorem rekordu. Numer w adresie da się podmienić, termin ważności nie.
Źródła
- Supabase — Custom SMTP (wbudowana usługa: 2 wiadomości na godzinę, nieprzeznaczona do produkcji; własny nadawca startuje z 30 na godzinę) — https://supabase.com/docs/guides/auth/auth-smtp (odczyt 31.08.2026)
- Supabase — Rate limits (30 kodów na godzinę w projekcie, 60 sekund na użytkownika, 15 prób weryfikacji drugiego składnika na godzinę) — https://supabase.com/docs/guides/auth/rate-limits (odczyt 31.08.2026)
- Supabase — Passwordless email logins (link ważny godzinę, jednorazowy, ważność powyżej doby odradzana) — https://supabase.com/docs/guides/auth/auth-email-passwordless (odczyt 31.08.2026)
- Supabase — User sessions (ograniczenie czasu sesji i wylogowanie po bezczynności od planu Pro) — https://supabase.com/docs/guides/auth/sessions (odczyt 31.08.2026)
- Supabase — Self-hosting Auth configuration (GOTRUE_JWT_EXP domyślnie 3 600 sekund, maksimum 604 800 sekund) — https://supabase.com/docs/guides/self-hosting/auth/config (odczyt 31.08.2026)
- Supabase Auth — README, sekcja Configuration (GOTRUE_PASSWORD_MIN_LENGTH domyślnie 6) — https://github.com/supabase/auth?tab=readme-ov-file#configuration (odczyt 31.08.2026)
- Supabase — Password security (zalecane minimum 8 znaków, ponowne uwierzytelnienie po 24 godzinach, blokowanie haseł z wycieków od planu Pro) — https://supabase.com/docs/guides/auth/password-security (odczyt 31.08.2026)
- Supabase — Signing out (zakresy wylogowania; tokeny dostępu ważne do końca swojego czasu ważności) — https://supabase.com/docs/guides/auth/signout (odczyt 31.08.2026)
- Supabase — Multi-Factor Authentication (aplikacja z kodem czasowym i kod wiadomością na telefon) — https://supabase.com/docs/guides/auth/auth-mfa (odczyt 31.08.2026)
- Supabase — Pricing (50 000 aktywnych użytkowników w planie darmowym; Pro od 25 USD, 100 000 w cenie, potem 0,00325 USD) — https://supabase.com/pricing (odczyt 31.08.2026)
- Google Cloud — Manage App Audience (stan „Testing”: do 100 użytkowników testowych, zgoda wygasa po 7 dniach) — https://support.google.com/cloud/answer/15549945 (odczyt 31.08.2026)
- Google Cloud — OAuth App Verification (zakresy niewrażliwe bez weryfikacji; weryfikacja marki dla nazwy i logo na ekranie zgody) — https://support.google.com/cloud/answer/9110914 (odczyt 31.08.2026)
- Apple — App Review Guidelines, punkt 4.8 Login Services — https://developer.apple.com/app-store/review/guidelines/ (odczyt 31.08.2026)
- Logowanie, konta i lekcje z uwierzytelniania w naszych wdrożeniach — praktyka zespołu — https://jakzrobicaplikacje.pl/o-serwisie/#skad (2026-08-31)
- Google — Sensitive scope verification (zakresy niezbędne do logowania Google są wstępnie wypełnione w sekcji Non-sensitive scopes) — https://developers.google.com/identity/protocols/oauth2/production-readiness/sensitive-scope-verification (odczyt 31.08.2026)
Tekst przygotował Agent AI Tomka Niedźwieckiego — treść wygenerowana przez sztuczną inteligencję na podstawie własnych wdrożeń zespołu, dokumentacji dostawców i źródeł podanych wyżej, sprawdzona w osobnym przebiegu weryfikacji faktów i zredagowana. Za fakty odpowiada Tomek Niedźwiecki. Ostatnia weryfikacja: 10 września 2026.