вход переехал на доверенный заголовок Authelia вместо собственного OIDC

- пришедшего называет заголовок Remote-User от прокси, и верят ему только с
  адреса из перечня trusted_proxies; своего входа у сервиса не осталось — ни
  корня /auth, ни кук, ни срока сессии, ни секрета клиента в конфиге и в базе
- учётная запись заводится первым обращением: EnsureUser в пакете хранилища,
  шаг схемы 202608220001 с колонкой provider_login и снятыми правилами users
- cmd/oidcstub заменён на cmd/devtools с подкомандой proxy; заодно закрыт
  унаследованный DL3066 — пользователь образа назван числом
This commit is contained in:
av
2026-08-22 20:24:22 +03:00
parent e4441f3c49
commit 7f33c957e5
63 changed files with 5257 additions and 2305 deletions
+31 -44
View File
@@ -60,56 +60,43 @@ object_storage_region = "ru-central1"
# Endpoint Object Storage
object_storage_endpoint = "https://storage.yandexcloud.net/"
# Вход через внешнего провайдера OIDC (Authelia).
# Без заполненной секции сервис не поднимается: молча выключенный вход оставил бы
# API открытым наружу.
# Кому сервис верит на входе.
#
# Своего входа у сервиса нет: кто пришёл, называет обратный прокси заголовком
# `Remote-User`, сходив к Authelia. Здесь остаётся один ключ — перечень адресов,
# чьему заголовку верить. Пустой перечень роняет старт: он значит «не верить
# никому», то есть сервис, поднявшийся никого не узнающим.
[auth]
# Адрес, куда сервис уводит человека на вход
auth_url = "https://auth.example.com/api/oidc/authorization"
# Адрес, где код обменивается на токен
token_url = "https://auth.example.com/api/oidc/token"
# Адрес, откуда берутся сведения о вошедшем
user_info_url = "https://auth.example.com/api/oidc/userinfo"
# Идентификатор клиента, заведённого у провайдера
client_id = "transcriber"
# Секрет клиента; приходит из выкладки, в git не коммитится
client_secret = ""
# Адрес возврата; тот же, что записан клиенту у провайдера
redirect_url = "https://transcriber.example.com/auth/callback"
# Признак `Secure` у куки сессии. Умолчание true; false только для локального
# запуска по http://localhost, где браузер такую куку не сохранит
secure_cookie = true
# Адреса и подсети, с которых приходит обратный прокси. Сверяется адрес самого
# соединения, а не пересылаемый заголовок: пересылаемым распоряжается тот, кто
# шлёт запрос.
#
# **Перечень задаёт адрес прокси, а не весь частный диапазон.** Всякий, кто
# дотянулся до сервиса с адреса из этого перечня, называет себя кем угодно и
# получает чужой архив; `172.16.0.0/12` означало бы «любой контейнер на хосте»,
# включая чужие проекты. На сервере сюда ставят адрес сети, в которой стоит
# Caddy, — узкий и свой.
trusted_proxies = ["172.20.0.0/24"]
# Локальный вход без Authelia.
#
# Провайдер на машине разработчика не поднимается, а ключи боевого на ней лежать
# не должны — вместо провайдера идёт заглушка `cmd/oidcstub`. Она отвечает на
# `/authorize`, `/token` и `/userinfo` и не сверяет ни секрет клиента, ни
# проверочный код PKCE: вход у неё один и заранее известный. Поднимается
# отдельным процессом:
# Прокси на машине разработчика нет, а браузер заголовков не ставит — значит
# приложение локально не открылось бы вовсе. На место контура встаёт подставной
# прокси из оснастки: он слушает свой порт, ставит заголовок и переправляет
# запрос сервису. Проверок он не делает никаких — ни пароля, ни группы, ни
# срока, — и это его назначение, а не упущение.
#
# go run ./cmd/oidcstub
# go run ./cmd/devtools proxy
#
# Замени секцию `[auth]` выше на эти значения — вход пойдёт настоящим путём,
# вплоть до куки сессии и заведённой учётной записи в панели:
# Приложение после этого открывают по адресу прокси — http://localhost:9000, —
# а не по адресу сервиса: запрос мимо прокси приходит без заголовка и никого не
# узнаёт.
#
# auth_url = "http://localhost:9000/authorize"
# token_url = "http://localhost:9000/token"
# user_info_url = "http://localhost:9000/userinfo"
# client_id = "transcriber"
# client_secret = "local"
# redirect_url = "http://localhost:8080/auth/callback"
# secure_cookie = false
# Под него в перечне выше должен стоять петлевой адрес:
#
# Другое значение `-sub` заводит второго вошедшего: это неизменяемый признак,
# по которому обмен ищет учётную запись. Почта переезжает вместе с ним сама —
# заглушка выводит её из `-sub`, — и это обязательно: при общей почте второй вход
# приходит к первой записи и получает отказ.
# trusted_proxies = ["127.0.0.1"]
#
# go run ./cmd/oidcstub -sub local-2
# Второй вошедший получается другим значением `-user`: логин у провайдера и есть
# ключ учётной записи.
#
# go run ./cmd/devtools proxy -user local-2 -name "Второй"