clienttokenwire

package
v0.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 27, 2026 License: AGPL-3.0 Imports: 15 Imported by: 0

Documentation

Overview

Package clienttokenwire — сборка токен-эндпоинта платформы (задача kacho#898, приёмка F2 §9.1 п. 11).

Зачем отдельный пакет сборки

Эндпоинт состоит из пяти частей, и четыре из них при полусобранной провязке выглядят исправными: проверяющий без потолка длительности принимает утверждение с любым сроком; выдача без перечня адресатов выдаёт токен, адресованный чему угодно; чтение реестра без предела времени висит на неотвечающем соседе, пока не кончатся горутины; выдача без читателя отсечки отзыва-всех не отличает «отсечек нет» от «спросить некого». Ни одно из четырёх не проявляется отказом на положительном пути.

Поэтому сборка — ОДНО место и ОДИН отказ: неполная провязка не поднимает сервис. Отказ в старте виден оператору сразу и называет величину; отказ на первом принятом чужом утверждении не виден никогда.

Почему величины приезжают ПАРАМЕТРОМ, а не читаются здесь

Потолок длительности утверждения и допуск расхождения часов объявлены числом ровно в одном месте — `pkg/tokenpolicy`. Читай их сборка сама, страж стал бы тождественно истинным: константа не бывает незаданной. Приезжая параметром, они становятся тем, что подал композиционный корень, — и это уже проверяемо.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func FromPool

func FromPool(
	pool *pgxpool.Pool,
	cfg BuildConfig,
	signer client_token.Signer,
	claims client_token.ClaimSource,
) (*clienttokenhttp.Handler, error)

FromPool собирает эндпоинт от пула: реестр, способный к утверждению, хранилище однократности и читатель отсечки отзыва-всех берутся из своей базы.

Читатель отсечки — адаптер ТОГО ЖЕ типа, что у полос хука (`kanamepg.NewSessionRevocationsAdapter`), но свой экземпляр над тем же пулом: эндпоинт собирается и там, где хуков поставщика нет. Одинаковость ответа полос держит не общий экземпляр, а три вещи, общие по построению: одна строка и один запрос к ней (тип адаптера), один предел времени на вызов (обёртка revocationpolicy.WithDeadline с объявленным пределом корня) и одно правило вердикта (`revocationpolicy.AtIssuance`).

func New

New собирает эндпоинт из уже готовых портов.

Разделено с провязкой от пула намеренно: сборка — то место, где живёт отказ, и она обязана проверяться без базы. Проверка, которой нужна база, гоняется реже, а страж обязан гоняться всегда.

func WithDeadlineIssuers

WithDeadlineIssuers оборачивает чтение перечня собственным пределом.

Тот же довод, что у чтения реестра: перечень лежит на пути АУТЕНТИФИКАЦИИ, и чтение без предела вешает горутину на неотвечающей базе — отказ приходит не туда, где причина.

func WithDeadlineReplay

func WithDeadlineReplay(inner clientassertion.ReplayGuard, timeout time.Duration) clientassertion.ReplayGuard

WithDeadlineReplay оборачивает допуск однократности собственным пределом.

func WithDeadlineResolver

func WithDeadlineResolver(inner clientassertion.ClientResolver, timeout time.Duration) clientassertion.ClientResolver

WithDeadlineResolver оборачивает чтение реестра собственным пределом.

Обёртка, а не предел у вызывающего: вызывающих у порта больше одного, и предел, выставленный у каждого по отдельности, у одного из них рано или поздно не появится — молча, потому что отсутствие предела выглядит как его наличие ровно до того дня, когда сосед перестаёт отвечать.

Types

type BuildConfig

type BuildConfig struct {
	// Logger — журнал исходов. Наружу все отказы аутентификации неразличимы,
	// поэтому различимость живёт здесь и в счётчиках.
	Logger *slog.Logger
	// ExpectedAudience — идентификатор НАШЕГО издателя: единственная
	// принимаемая форма адресата утверждения.
	ExpectedAudience string
	// AssertionLifetimeCeiling — потолок разницы «срок − момент выпуска» на
	// полосе аутентификации клиента.
	AssertionLifetimeCeiling time.Duration
	// FederatedLifetimeCeiling — тот же потолок на федеративной полосе, где
	// утверждение подписал внешний издатель (kacho#1124). Отдельная величина, а не
	// та же: внешний издатель выпускает своей нагрузке токен со своим сроком.
	FederatedLifetimeCeiling time.Duration
	// ClockSkew — допуск расхождения часов, на обе стороны.
	ClockSkew time.Duration
	// Clock — источник времени. Вход, а не окружение.
	Clock func() time.Time
	// AllowedAudiences — объявленный перечень адресатов платформы.
	AllowedAudiences []string
	// DefaultAudience — адресат, когда запрос его не назвал.
	DefaultAudience string
	// TokenTTL — обычный срок выпускаемого токена.
	TokenTTL time.Duration
	// BodyCeiling — потолок тела запроса.
	BodyCeiling int64
	// Ceremony — полосы церемонии OAuth на этом эндпоинте; nil — церемония на
	// посадке не собрана (см. `clienttokenhttp.Config.Ceremony`).
	Ceremony clienttokenhttp.CeremonyLane
	// PeerTimeout — предел времени КАЖДОГО внешнего вызова этого пути: чтения
	// реестра, допуска однократности и чтения отсечки отзыва-всех.
	//
	// Обязателен, а не «разумное умолчание»: неотвечающий сосед без предела
	// вешает горутину навсегда, и горутины копятся до исчерпания процесса —
	// то есть отказ приходит не туда, где причина.
	PeerTimeout time.Duration
	// ExchangesPerClientPerSec — темп обменов в секунду на идентификатор
	// клиента, на процесс (kaname#315). Судится проверяющим по заявленному
	// идентификатору ДО реестра; тратят его только принятые предъявления.
	ExchangesPerClientPerSec int
	// InFlightCeiling — потолок одновременных обменов на процесс, все четыре
	// вида выдачи (П1, kaname#315).
	InFlightCeiling int
	// FailedProofsPerSource и FailedProofWindow — ось П3: неудавшихся
	// доказательств клиента за скользящее окно на источник, на процесс.
	FailedProofsPerSource int
	FailedProofWindow     time.Duration
	// Source — адрес источника запроса по правилу Р7 (`issuingsource`): ключ
	// П3. Обязателен — без него окну нечем ключеваться.
	Source func(*http.Request) string
}

BuildConfig — вход сборки. Каждая величина обязательна.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL