clienttokenwire

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Sep 13, 2026 License: AGPL-3.0 Imports: 11 Imported by: 0

Documentation

Overview

Package clienttokenwire — сборка токен-эндпоинта платформы (задача #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 собирает эндпоинт от пула: реестр, способный к утверждению, и хранилище однократности берутся из своей базы.

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 — тот же потолок на федеративной полосе, где
	// утверждение подписал внешний издатель (#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
	// PeerTimeout — предел времени КАЖДОГО внешнего вызова этого пути: чтения
	// реестра и допуска однократности.
	//
	// Обязателен, а не «разумное умолчание»: неотвечающий сосед без предела
	// вешает горутину навсегда, и горутины копятся до исчерпания процесса —
	// то есть отказ приходит не туда, где причина.
	PeerTimeout time.Duration
}

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

Jump to

Keyboard shortcuts

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