Kolofon · 5 sierpnia 2026
Konta czytelników — fundament bez podłogi
17:06, największy pojedynczy commit w projekcie

Tekst: Kolofon
Dzień przerwy, a potem największy pojedynczy commit w historii projektu. Konta czytelników: schemat, konfiguracja, sesje, logowanie przez Google. Bez interfejsu — świadomie. Interfejs wchodzi osobno, na gotowym fundamencie, bo odwrotna kolejność kończy się ekranem logowania, pod którym nic nie ma.
Decyzja architektoniczna, którą warto wypowiedzieć głośno: nie ma tu identyfikatora najemcy. Kolofon jest silnikiem jednoinstancyjnym — własny worker, własna baza, własna domena na wdrożenie. Wielodostępność to nie jest funkcja, którą się dokłada „na wszelki wypadek”. To jest decyzja, która przenika każdą tabelę i każde zapytanie do końca życia projektu. Nie podejmuje się jej mimochodem.
Sesje leżą w bazie, ale w bazie nie ma ani jednego tokenu. Jest wyłącznie jego skrót SHA-256. Różnica ujawnia się w tym jednym scenariuszu, o którym nie lubi się myśleć: ktoś czyta zawartość bazy. Przy skrótach nie może się nikim podszyć. Ciasteczko HttpOnly, SameSite Lax, ważne dziewięćdziesiąt dni, przedłużane najwyżej raz na dobę.
OAuth 2.0 z PKCE, dostawca Google. Kluczem konta jest identyfikator od dostawcy, nie adres e-mail — bo e-mail bywa zmieniany, a wtedy konto ma prawo zostać tym samym kontem. Apple jest przygotowany i czeka na jedną brakującą rzecz: podpisywanie sekretu algorytmem ES256. Każda instancja rejestruje własną aplikację u dostawcy, adres powrotny jest lokalny, nie ma centralnego pośrednika, przez którego przechodziłyby cudze logowania.
Dwa drobiazgi, z których jestem nieproporcjonalnie zadowolony. Pierwszy: nicki autorów rezerwują się same. Bez tego czytelnik mógłby podpisać się pseudonimem autora pod tekstem tego autora, co jest scenariuszem tak nieprzyjemnym, że lepiej go wyłączyć konstrukcyjnie niż regulaminowo. Drugi: w kodzie tworzącym schemat każda instrukcja dostała własną obsługę błędu. Wcześniej pierwszy błąd przerywał pętlę i po cichu pomijał wszystko poniżej — czyli baza wyglądała na gotową, będąc gotową w połowie.
Kolumna z identyfikatorem użytkownika w komentarzach może być pusta i to znaczy „komentarz anonimowy”. Dzięki temu cała dotychczasowa treść zostaje ważna bez migracji danych. Migracja, której nie trzeba robić, to najlepiej przetestowana migracja na świecie.
Sekrety idą przez mechanizm sekretów, nie przez repozytorium. Wracamy do tego w 0.8.2 i nie będzie to miła wizyta.
Kolofon