feat(auth): OIDC SSO для веб-интерфейса (Authelia/LLDAP и любые OIDC-провайдеры) #1
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/oidc-sso"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что это
Фича-форк поверх upstream
vestigiumincaligne/polka(v0.1.22, master01c2712): OIDC Authorization Code flow для веб-UI. В upstream есть только локальные аккаунты и HTTP Basic для OPDS — OIDC/LDAP/header-auth там нет (проверено по исходникам).Зачем: в кластере уже есть Authelia (поверх LLDAP) с полноценным OIDC — централизованный SSO вместо отдельного аккаунта Polka. Реализован стандартный flow, так что работает с любым провайдером: Authelia, Keycloak, Dex, OIDC-endpoint LLDAP и т.д.
Как работает
/.well-known/openid-configurationна старте (endpoints + поддержка PKCE). Конфиг не валиден → сервер падает, а не стартует в полуконфигурации./auth/oidc/login→ 302 на провайдера:state+nonceв короткоживущей HttpOnly-cookie (10 мин), PKCE S256 если провайдер умеет./auth/oidc/callback: обмен кода → claims из id_token payload + userinfo fallback (группы:groups/member_of/roles), JIT-проvisioning локального аккаунта поsub(логин изpreferred_username/email local-part, коллизии → суффикс), открытие штатной Polka-сессии (cookie).POLKA_OIDC_ADMIN_GROUP), без авто-демоции — админы управляются локально.oidc_sub(unique) +oidc_name, миграция в стиле проекта (migrateProgress),StartSessionвынесен изLoginдля непарольного пути.auth/meотдаёт блокoidc→ кнопка «Войти через {provider}» на LoginPage (i18n ru/en).Конфиг (env/флаги, по умолчанию выключено)
Тесты
internal/auth/oidc_test.go): JIT-проvisioning, обновление имени, промо/нет-демоция по группе, disabled-аккаунт, коллизия логина с локальным аккаунтом.internal/server/oidc_e2e_test.go): полный браузерный флоу (hop-by-hop, cookie jar) против фейкового IdP — реклама кнопки в auth/me, provision+login, промоция по группе, forged state → 400, без конфига SSO невидим (SPA fallback).oidc_smoke.py): собранный бинарь + мок-IdP — discovery, PKCE в auth-запросе, callback, сессия, промоция, локальный путь цел (401 на плохие креды). EXIT=0.go vetчист,go test ./...зелёный (один разовый флак SQLITE_BUSY при параллельном прогоне, повторные прогоны чистые), веб-тесты 24/24.Известные упрощения
end_session_endpointпока не используется (logout локальный).Pull request closed