Перейти к основному содержимому

Аутентификация и безопасность

Локальные учётные записи и JWT-сессии. Новая установка всегда позволяет создать одного локального администратора; дальнейшая публичная регистрация закрыта.

Первая настройка

Первая учётная запись в пустой базе получает admin; последующие — только при включённой регистрации. Существующие роли не меняются.

Локальные учётные записи

Имя, необязательный e-mail, пароль 12 znaków–72 bajty UTF-8 с прописной, строчной буквой и цифрой. bcrypt, rate-limit.

Одобрение регистрации

Публичные учётные записи начинают в pending. Исключение: первый bootstrap active/admin.

Регистрация возвращает 202, approvalRequired: true, без токена. Login: 403, ACCOUNT_PENDING; OAuth ?approval=pending. Статус проверяется всегда.

Администратор видит Oczekujące, aktywuj/odrzuć, badge/toast, polling GET /api/users/pending-approvals, akceptację PATCH /api/users/:id/approve. Rola pozostaje user.

Включайте регистрацию осознанно

ENABLE_SIGNUP=false по-прежнему позволяет создать первого администратора.

ENABLE_SIGNUP=true

После окна верните false. Пустая база всегда разрешает одного локального администратора; OAuth не занимает место. Удалённый bootstrap защитите Cloudflare Access.

Роли

admin: instancja, użytkownicy, system, Work. user: zwykłe funkcje. Операции моделей, меняющие хост, доступны только администратору.

Work

По умолчанию только администратор из-за произвольных команд. Можно открыть активным пользователям, но папки хоста остаются admin-only. Считайте доступ правами оператора runtime.

Текущая роль из базы немедленно отменяет доступ. Backend останавливает runs и контейнеры, сохраняя записи и тома. Ошибка cleanup не возвращает доступ. При удалении пользователя сначала удаляются его ресурсы Work; отсутствие подтверждённой очистки блокирует удаление.

Группы и права

Владелец чата, заметки, документа, коллекции, папки, персоны, prompt, навыка или календаря может дать read, write, admin пользователю или группе через общий диалог (Общий доступ). Глобальный admin не видит чужой контент. Членство проверяется при запросе.

Аудит

Входы, ошибки, выходы, отозвания и изменения попадают в append-only журнал после редактирования. Изменение и аудит в одной транзакции. AUDIT_RETENTION_DAYS по умолчанию 180.

Сессии

JWT_SECRET=replace-with-a-long-random-secret

Изменение JWT_SECRET аннулирует сессии. JWT_EXPIRES_IN по умолчанию 7d. WebSocket использует короткий одноразовый билет. Серверные сессии можно отозвать на всех репликах; старые без ID истекают или подчиняются cutoff.

2FA и passkeys

TOTP: base32, otpauth://, код из 6 цифр, 10 кодов восстановления, POST /api/auth/mfa/verify, защита от replay и одноразовые коды. Passkeys WebAuthn: discoverable, проверка пользователя, attestation none, ES256/EdDSA, шифрование, challenge на 5 минут, счётчик клона, HTTPS/localhost, WEBAUTHN_RP_ID.

Challenge MFA использует секрет, производный от JWT_SECRET, не авторизует API и расходуется при успехе. Администратор может потребовать MFA_REQUIRED_MODE=required и сбрасывать TOTP. OAuth/OIDC доверяет поставщику; API-токены без изменений.

API-токены

Префикс lwk_, секрет показывается один раз, хранится только hash. Scopes chat, models, documents, notes, personas, media, work, admin; маршруты требуют scope, сессии недоступны. Поддерживаются срок, последнее использование, revoke и rate-limit. Admin token требует актуальную роль администратора. chat работает с публичным /v1.

Turnstile

TURNSTILE_EXPECTED_HOSTNAME можно задать явно.

TURNSTILE_SITE_KEY=...
TURNSTILE_SECRET_KEY=...
TURNSTILE_EXPECTED_HOSTNAME=chat.example.com

Действия login/signup, проверка хоста; BASE_URL fallback. Без обоих ключей отключено.

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. Случайный state w HttpOnly SameSite, callback отклоняет mismatch. JWT w 60-sekundowym cookie, никогда URL/history/referrer.

Перенаправления и 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

Демо

Frontend с имитациями, не производственная аутентификация.

Список безопасности

Сильный JWT_SECRET, постоянный DATA_DIR, backup ENCRYPTION_KEY, Turnstile, HTTPS, минимальные ключи, точные callbacks, Work только доверенным.

Связанные