Documentation
¶
Overview ¶
Package clienttokenwire — сборка токен-эндпоинта платформы (задача #898, приёмка F2 §9.1 п. 11).
Зачем отдельный пакет сборки ¶
Эндпоинт состоит из четырёх частей, и три из них при полусобранной провязке выглядят исправными: проверяющий без потолка длительности принимает утверждение с любым сроком; выдача без перечня адресатов выдаёт токен, адресованный чему угодно; чтение реестра без предела времени висит на неотвечающем соседе, пока не кончатся горутины. Ни одно из трёх не проявляется отказом на положительном пути.
Поэтому сборка — ОДНО место и ОДИН отказ: неполная провязка не поднимает сервис. Отказ в старте виден оператору сразу и называет величину; отказ на первом принятом чужом утверждении не виден никогда.
Почему величины приезжают ПАРАМЕТРОМ, а не читаются здесь ¶
Потолок длительности утверждения и допуск расхождения часов объявлены числом ровно в одном месте — `pkg/tokenpolicy`. Читай их сборка сама, страж стал бы тождественно истинным: константа не бывает незаданной. Приезжая параметром, они становятся тем, что подал композиционный корень, — и это уже проверяемо.
Index ¶
- func FromPool(pool *pgxpool.Pool, cfg BuildConfig, signer client_token.Signer, ...) (*clienttokenhttp.Handler, error)
- func New(cfg BuildConfig, clients clientassertion.ClientResolver, ...) (*clienttokenhttp.Handler, error)
- func WithDeadlineIssuers(inner clientassertion.TrustedIssuerResolver, timeout time.Duration) clientassertion.TrustedIssuerResolver
- func WithDeadlineReplay(inner clientassertion.ReplayGuard, timeout time.Duration) clientassertion.ReplayGuard
- func WithDeadlineResolver(inner clientassertion.ClientResolver, timeout time.Duration) clientassertion.ClientResolver
- type BuildConfig
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 ¶
func New( cfg BuildConfig, clients clientassertion.ClientResolver, issuers clientassertion.TrustedIssuerResolver, replay clientassertion.ReplayGuard, signer client_token.Signer, claims client_token.ClaimSource, ) (*clienttokenhttp.Handler, error)
New собирает эндпоинт из уже готовых портов.
Разделено с провязкой от пула намеренно: сборка — то место, где живёт отказ, и она обязана проверяться без базы. Проверка, которой нужна база, гоняется реже, а страж обязан гоняться всегда.
func WithDeadlineIssuers ¶
func WithDeadlineIssuers( inner clientassertion.TrustedIssuerResolver, timeout time.Duration, ) clientassertion.TrustedIssuerResolver
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 — вход сборки. Каждая величина обязательна.