Uwierzytelnianie i bezpieczeństwo
Lokalne konta i sesje JWT. Nowa instalacja zawsze pozwala utworzyć jednego lokalnego administratora; dalsza publiczna rejestracja jest zamknięta.
Strona logowania ma obok przełącznika motywu wybór języka. Język można ustawić przed zalogowaniem; wybór zapisuje się w bieżącej przeglądarce i obowiązuje także przy rejestracji.
Pierwsza konfiguracja
Pierwsze konto w pustej bazie otrzymuje admin; kolejne tylko przy włączonej rejestracji. Istniejące role bez zmian.
Konta lokalne
Nazwa, opcjonalny e-mail, hasło 12 znaków–72 bajty UTF-8 z dużą/małą literą i cyfrą. bcrypt, rate-limit.
Zarządzanie użytkownikami
Administratorzy otwierają Settings → Zarządzanie użytkownikami, aby administrować instancją. Adres /users otwiera ten sam obszar ustawień, zaczynając od listy kont. Administracja dzieli się na pięć sekcji:
- Użytkownicy: konta, oczekujące akceptacje rejestracji, tworzenie i edycja kont, usuwanie oraz odzyskiwanie drugiego składnika.
- Grupy: członkostwa w grupach i wyszukiwanie efektywnego dostępu.
- Dostęp i zasady: dostęp do Work i zasady środowiska, ustawienia Ollama, pobieranie modeli, wyszukiwanie w sieci, Agenci, narzędzia, uprawnienia głosowe oraz serwer poczty wychodzącej dla powiadomień e-mail.
- Bezpieczeństwo: zasada dwuskładnikowa instancji oraz log audytu bezpieczeństwa.
- Ustawienia domyślne: motyw strony logowania i kont bez własnej preferencji motywu.
Listę kont przeszukasz po nazwie użytkownika lub adresie e-mail i przefiltrujesz według roli. Oczekujące rejestracje pozostają oddzielone od kont aktywnych, więc łatwo zauważyć pracę do akceptacji. Wyczyszczenie wyszukiwania i filtra roli przywraca pełną listę.
Utwórz użytkownika i Edytuj użytkownika otwierają skupione formularze konta. Puste hasło podczas edycji zachowuje dotychczasowe. Usunięcie i reset drugiego składnika proszą o potwierdzenie dla wybranego konta przed wprowadzeniem zmiany.
Nawigacja między sekcjami obsługuje strzałki oraz klawisze Home i End, także w układach od prawej do lewej. Zmiana sekcji zachowuje niedokończone formularze, dopóki Zarządzanie użytkownikami pozostaje otwarte. Pozostałe sekcje ładują się przy pierwszym otwarciu, więc otwarcie listy kont nie ładuje wszystkich zasad ani elementów audytu.
Akceptacja rejestracji
Publiczne konta zaczynają pending. Wyjątek: pierwszy bootstrap active/admin.
Rejestracja zwraca 202, approvalRequired: true, bez tokenu. Login: 403, ACCOUNT_PENDING; OAuth ?approval=pending. Status sprawdzany zawsze.
Administrator ma Oczekujące, aktywuj/odrzuć, badge/toast, polling GET /api/users/pending-approvals, akceptację PATCH /api/users/:id/approve. Rola pozostaje user.
Włącz rejestrację świadomie
ENABLE_SIGNUP=false nadal pozwala utworzyć pierwszego administratora.
ENABLE_SIGNUP=true
Po oknie wróć do false. Pusta baza zawsze pozwala jednego lokalnego admina; OAuth nie zajmuje slotu. Zdalny bootstrap chroń Cloudflare Access.
Role
admin: instancja, użytkownicy, system, Work. user: zwykłe funkcje. Operacje modeli zmieniające host są admin-only.
Work
Domyślnie admin-only z powodu arbitralnych komend. Można otworzyć dla aktywnych w Settings → Zarządzanie użytkownikami → Dostęp i zasady, ale foldery hosta nadal admin-only. Dostęp traktuj jako operatora runtime.
Aktualna rola z bazy unieważnia dostęp natychmiast. Backend zatrzymuje runy/kontenery zachowując rekordy/wolumeny. Błąd cleanup nie przywraca dostępu. Usunięcie użytkownika najpierw usuwa Work; brak dowodu cleanup blokuje.
Grupy i granty
Administratorzy tworzą grupy i zarządzają członkostwem w Settings → Zarządzanie użytkownikami → Grupy. Wyszukiwanie efektywnego dostępu znajduje się w tej samej sekcji. Właściciel chatu, notatki, dokumentu, kolekcji, folderu, persony, promptu, umiejętności lub kalendarza może dać read, write, admin użytkownikowi/grupie przez wspólny dialog (Udostępnianie). Global admin nie widzi cudzej treści. Członkostwo sprawdzane na żądanie.
Audyt
Loginy, błędy, wylogowania, odwołania i zmiany trafiają do append-only logu po redakcji. Zmiana i audyt w jednej transakcji. Administratorzy przeglądają log w Settings → Zarządzanie użytkownikami → Bezpieczeństwo; AUDIT_RETENTION_DAYS domyślnie 180.
Sesje
JWT_SECRET=replace-with-a-long-random-secret
Zmiana JWT_SECRET unieważnia. JWT_EXPIRES_IN domyślnie 7d. WebSocket używa krótkiego jednorazowego biletu. Sesje serwerowe można odwołać na wszystkich replikach; stare bez ID wygasają lub podlegają cutoff.
2FA i passkeys
TOTP: base32, otpauth://, kod 6 cyfr, 10 kodów odzysku, POST /api/auth/mfa/verify, ochrona replay, kody jednorazowe. Passkeys WebAuthn: discoverable, weryfikacja użytkownika, attestation none, ES256/EdDSA, szyfrowanie, challenge 5 min, licznik klonu, HTTPS/localhost, WEBAUTHN_RP_ID.
Challenge MFA używa sekretu pochodnego od JWT_SECRET, nie autoryzuje API i jest zużywany. Administrator może wymusić drugi składnik w Settings → Zarządzanie użytkownikami → Bezpieczeństwo lub przez MFA_REQUIRED_MODE=required oraz resetować TOTP. OAuth/OIDC ufa providerowi; tokeny API bez zmian.
Tokeny API
Prefix lwk_, sekret raz, hash. Scopes chat, models, documents, notes, personas, media, work, admin; route wymagają scope, sesje niedostępne. Wygasanie, ostatnie użycie, revoke i rate-limit. Admin token wymaga admina. chat działa z publicznym /v1.
Turnstile
TURNSTILE_EXPECTED_HOSTNAME można ustawić jawnie.
TURNSTILE_SITE_KEY=...
TURNSTILE_SECRET_KEY=...
TURNSTILE_EXPECTED_HOSTNAME=chat.example.com
Akcje login/signup, weryfikacja hosta; BASE_URL fallback. Bez obu kluczy wyłączone.
GitHub OAuth
GITHUB_CLIENT_ID=...
GITHUB_CLIENT_SECRET=...
GITHUB_CALLBACK_URL=https://your-domain.example/api/auth/oauth/github/callback
gh_, rola user.
Hugging Face OAuth
HUGGINGFACE_CLIENT_ID=...
HUGGINGFACE_CLIENT_SECRET=...
HUGGINGFACE_CALLBACK_URL=https://your-domain.example/api/auth/oauth/huggingface/callback
hf_, rola user. Losowy state w HttpOnly SameSite, callback odrzuca mismatch. JWT w 60-sekundowym cookie, nigdy URL/history/referrer.
Redirecty i CORS
Ustaw CORS_ORIGIN:
BASE_URL=https://your-domain.example
CORS_ORIGIN=https://your-domain.example
CORS_ORIGIN=http://localhost:5173,http://127.0.0.1:5173
Demo
Frontend z mockami, nie produkcyjne auth.
Lista bezpieczeństwa
Silny JWT_SECRET, trwały DATA_DIR, backup ENCRYPTION_KEY, Turnstile, HTTPS, minimalne klucze, dokładne callbacks, Work tylko zaufani.