Przejdź do głównej zawartości

Uwierzytelnianie i bezpieczeństwo

Lokalne konta i sesje JWT. Nowa instalacja zawsze pozwala utworzyć jednego lokalnego administratora; dalsza publiczna rejestracja jest zamknięta.

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.

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, 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

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. 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ć MFA_REQUIRED_MODE=required i 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.

Powiązane