refactor: убрать вход через внешние провайдеры (OAuth) полностью
Решение владельца 27.09.2026 (D-084): сервис ставится на сервер конкретного человека, и ему всё равно нужен свой OAuth у провайдера — поддержка общего входа только создаёт трение (регистрация приложений, redirect URI, модерация, чужие ключи в конфиге). Способы входа остаются: пароль + 2FA и ключи доступа (WebAuthn). Удалено: - сервер: internal/auth/oauth.go, internal/server/oauth.go, internal/store/oauth.go и их тесты; поля и методы конфига OAuth*; oauthLimiter и регистрация ручек; отображение ошибок oauth.*; features.oauth_enabled/oauth_providers в /meta; - клиент: web/src/api/oauth.ts, раздел «Вход через внешние сервисы», кнопки провайдеров на странице входа, ключи i18n (ru/en), тесты и фикстуры; - установщик: переменные OAUTH_* из .env, .env.example и шаблона (хелпер чтения существующих значений переименован в existing_value — он остался нужен для VAPID_SUBJECT); - зависимость golang.org/x/oauth2 (go mod tidy). Схема: миграция 00027 удаляет таблицу oauth_accounts (00019 не переписываем — она применена на стендах). Откат миграции возвращает структуру; тест TestOAuthRemovalMigration проверяет накат, откат и повторный накат. AGENT.md (локальный) помечает пункты про OAuth как отменённые.
This commit is contained in:
@@ -62,21 +62,6 @@ type Config struct {
|
||||
RetainAuditDays int
|
||||
RetainOrphanHours int
|
||||
RetainInterval time.Duration
|
||||
// OAuth-провайдеры (AGENT.md 7.1, Фаза 7): включаются парами
|
||||
// client id/secret, пустые значения означают «провайдер выключен».
|
||||
OAuthVKClientID string
|
||||
OAuthVKClientSecret string
|
||||
OAuthYandexClientID string
|
||||
OAuthYandexClientSecret string
|
||||
OAuthGitHubClientID string
|
||||
OAuthGitHubClientSecret string
|
||||
OAuthGoogleClientID string
|
||||
OAuthGoogleClientSecret string
|
||||
OAuthDiscordClientID string
|
||||
OAuthDiscordClientSecret string
|
||||
// OAuthRedirectBase — внешний адрес инстанса для redirect_uri (пусто —
|
||||
// берётся BaseURL из домена). Нужен, если клиент ходит по другому адресу.
|
||||
OAuthRedirectBase string
|
||||
// Web Push (AGENT.md 7.16, Фаза 7): приватный VAPID-ключ (PKCS#8 DER в
|
||||
// base64, генерирует установщик) и контакт администратора для push-сервисов
|
||||
// (mailto:… или https://…). Пустой ключ — Web Push выключен.
|
||||
@@ -125,18 +110,6 @@ func Load() (Config, error) {
|
||||
RetainOrphanHours: envInt("RETENTION_ORPHAN_HOURS", 24),
|
||||
RetainInterval: time.Duration(envInt("RETENTION_INTERVAL_SECONDS", 3600)) * time.Second,
|
||||
|
||||
OAuthVKClientID: env("OAUTH_VK_CLIENT_ID", ""),
|
||||
OAuthVKClientSecret: env("OAUTH_VK_CLIENT_SECRET", ""),
|
||||
OAuthYandexClientID: env("OAUTH_YANDEX_CLIENT_ID", ""),
|
||||
OAuthYandexClientSecret: env("OAUTH_YANDEX_CLIENT_SECRET", ""),
|
||||
OAuthGitHubClientID: env("OAUTH_GITHUB_CLIENT_ID", ""),
|
||||
OAuthGitHubClientSecret: env("OAUTH_GITHUB_CLIENT_SECRET", ""),
|
||||
OAuthGoogleClientID: env("OAUTH_GOOGLE_CLIENT_ID", ""),
|
||||
OAuthGoogleClientSecret: env("OAUTH_GOOGLE_CLIENT_SECRET", ""),
|
||||
OAuthDiscordClientID: env("OAUTH_DISCORD_CLIENT_ID", ""),
|
||||
OAuthDiscordClientSecret: env("OAUTH_DISCORD_CLIENT_SECRET", ""),
|
||||
OAuthRedirectBase: env("OAUTH_REDIRECT_BASE", ""),
|
||||
|
||||
VAPIDPrivateKey: env("VAPID_PRIVATE_KEY", ""),
|
||||
VAPIDSubject: env("VAPID_SUBJECT", ""),
|
||||
|
||||
@@ -188,9 +161,6 @@ func (c Config) VoiceEnabled() bool {
|
||||
return c.LiveKitAPIKey != "" && c.LiveKitAPISecret != "" && c.LiveKitURL != ""
|
||||
}
|
||||
|
||||
// OAuthEnabled сообщает, настроен ли хотя бы один OAuth-провайдер (AGENT.md 7.1).
|
||||
func (c Config) OAuthEnabled() bool { return len(c.OAuthProviders()) > 0 }
|
||||
|
||||
// WebPushEnabled сообщает, настроен ли Web Push: без VAPID-ключа подписки
|
||||
// браузеров принимать некуда (AGENT.md 7.16).
|
||||
func (c Config) WebPushEnabled() bool { return strings.TrimSpace(c.VAPIDPrivateKey) != "" }
|
||||
@@ -212,27 +182,6 @@ func (c Config) WebAuthnEnabled() bool {
|
||||
return net.ParseIP(host) == nil
|
||||
}
|
||||
|
||||
// OAuthProviders перечисляет включённые провайдеры в стабильном порядке.
|
||||
func (c Config) OAuthProviders() []string {
|
||||
providers := make([]string, 0, 5)
|
||||
for _, candidate := range []struct {
|
||||
id string
|
||||
client string
|
||||
secret string
|
||||
}{
|
||||
{"vk", c.OAuthVKClientID, c.OAuthVKClientSecret},
|
||||
{"yandex", c.OAuthYandexClientID, c.OAuthYandexClientSecret},
|
||||
{"github", c.OAuthGitHubClientID, c.OAuthGitHubClientSecret},
|
||||
{"google", c.OAuthGoogleClientID, c.OAuthGoogleClientSecret},
|
||||
{"discord", c.OAuthDiscordClientID, c.OAuthDiscordClientSecret},
|
||||
} {
|
||||
if candidate.client != "" && candidate.secret != "" {
|
||||
providers = append(providers, candidate.id)
|
||||
}
|
||||
}
|
||||
return providers
|
||||
}
|
||||
|
||||
func (c Config) BaseURL() string { return c.Scheme() + "://" + c.Domain }
|
||||
func (c Config) FilesURL() string { return c.Scheme() + "://" + c.FilesDomain }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user