Documentation
¶
Overview ¶
Package clienttokenwire — сборка токен-эндпоинта платформы (задача kacho#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 собирает эндпоинт от пула: реестр, способный к утверждению, хранилище однократности и читатель отсечки отзыва-всех берутся из своей базы.
Читатель отсечки — адаптер ТОГО ЖЕ типа, что у полос хука (`kanamepg.NewSessionRevocationsAdapter`), но свой экземпляр над тем же пулом: эндпоинт собирается и там, где хуков поставщика нет. Одинаковость ответа полос держит не общий экземпляр, а три вещи, общие по построению: одна строка и один запрос к ней (тип адаптера), один предел времени на вызов (обёртка revocationpolicy.WithDeadline с объявленным пределом корня) и одно правило вердикта (`revocationpolicy.AtIssuance`).
func New ¶
func New( cfg BuildConfig, clients clientassertion.ClientResolver, issuers clientassertion.TrustedIssuerResolver, replay clientassertion.ReplayGuard, signer client_token.Signer, claims client_token.ClaimSource, revocations client_token.RevocationLookup, ) (*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 — тот же потолок на федеративной полосе, где
// утверждение подписал внешний издатель (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 — вход сборки. Каждая величина обязательна.