Documentation
¶
Overview ¶
Package bootstraptokenwire — composition-root wiring for the InternalBootstrapTokenService handler (#58). Assembles the bootstrap-token mint use-case (BootstrapStore pg adapter + НАШ подписант) and its thin gRPC handler. Single wire-up call for cmd/kaname.
───────────────────────────────────────────────────────────────────────────── ЧТО ЗДЕСЬ ИЗМЕНИЛОСЬ И ПОЧЕМУ ЭТО ГЛАВНОЕ (задача #1119, Ф4б эпика #896)
Сборка держала к внешнему поставщику ДВЕ дороги: административного клиента для заведения его OAuth-клиента и клиента его токен-эндпоинта для обмена подписанного утверждения. Обе сняты: удостоверение чеканит НАШ подписант.
Следствие, ради которого фаза и делается: у сборки не осталось ни одного поля, называющего адрес или якорь поставщика, — то есть свежий клон поднимается в боевой посадке, не дожидаясь, пока чужая сторона поднимется и узнает наш ключ.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Build ¶
func Build(pool *pgxpool.Pool, cfg BuildConfig) (*bootstraptoken.Handler, error)
Build assembles the bootstrap-token mint handler. Composition root only.
Неполный вход при ВКЛЮЧЁННОМ контуре — отказ построения, а не деградация: собранный наполовину контур отвечал бы отказом на первом же запросе, и узнать об этом было бы неоткуда — стенд поднялся бы Ready.
Types ¶
type BuildConfig ¶
type BuildConfig struct {
// SigningKeyPEM — the bootstrap ES256 (P-256, PKCS#8) private key PEM,
// supplied from a k8s Secret (KANAME_BOOTSTRAP_SA_PRIVATE_KEY_PEM). Empty →
// mint disabled (fail-closed).
SigningKeyPEM string
// Signer — НАШ подписант. Обязателен, когда контур включён: выпускать иначе
// нечем, и «включено, но нечем» здесь не выражается.
Signer TokenSigner
// Claims — состав утверждений. Обязателен вместе с подписантом: токен без
// принципала край принял бы и не нашёл, за кого тот говорит.
Claims ClaimsComposer
// GatewayAudience — адресат выпускаемого удостоверения (https://{API_DOMAIN}).
GatewayAudience string
// TokenTTL — срок выпускаемого удостоверения; ноль → умолчание контура.
TokenTTL time.Duration
// Logger — surfaces mint failures. nil → no logging.
Logger *slog.Logger
}
BuildConfig — composition inputs for the bootstrap-token mint handler.
type ClaimsComposer ¶
type ClaimsComposer interface {
ClaimsForAssertionClient(ctx context.Context, client domain.AssertionClient, hookCtx service.TokenHookContext) (map[string]any, service.ResolvedPrincipal, error)
}
ClaimsComposer — состав утверждений выпускаемого токена.
Порт объявлен здесь узко и НАМЕРЕННО ведёт к тому же объявлению, каким состав собирается на остальных полосах выдачи: перевод чеканки не вправе тихо сменить принципала, а сменил бы он его именно так — второй сборкой утверждений, чьё расхождение с первой не выражено и потому не может покраснеть.
type TokenSigner ¶
type TokenSigner interface {
Sign(ctx context.Context, req tokensigner.Request) (tokensigner.Token, error)
}
TokenSigner — подписант с точки зрения этой сборки.
Заведён портом, а не конкретным типом, ровно по той причине, по какой был заведён порт обмена у прежней полосы: классификация отказа ниже — решение о ПОЛОСЕ ответа, и проверять его надо на настоящем адаптере, а не на копии его логики в пробе.