tokenintrospecthttp

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: 19 Imported by: 0

Documentation

Overview

Package tokenintrospecthttp — авторитет отзыва НАШИХ токенов на cluster-внутреннем слушателе (задача #897).

Зачем он существует

Контроль, действующий на ВЫДАЧЕ и не действующий на ПРЕДЪЯВЛЕНИИ, отзывом не является: он лишь не выдаёт нового, а предъявленное продолжает проходить до истечения срока. Это состояние не сходится само — в отличие от задержки распространения, — и потому окно отзыва равнялось бы сроку токена, а не сроку, который мы выбрали.

Отсюда: у поверхности, принимающей наш токен, есть читатель отзыва НА ПУТИ ЗАПРОСА, и спрашивает он нас. Мы — единственные, кто знает про наши токены: прежний провайдер о них не знает by construction, поэтому вопрос ему был бы вопросом не про тот предмет.

Форма ответа выбрана стандартной намеренно

Ответ — тот же документ, которого ждёт всякий, кто умеет спрашивать про действительность токена (RFC 7662): `{"active": true|false}`. Своя форма заставила бы переписывать каждого спрашивающего и сделала бы будущее решение о поверхности решением о переписывании.

Что этот авторитет НЕ делает

Он не рассказывает, ЧЕМ токен негоден. Наружу уходит суждение, подробность — в журнал: различение подсказывало бы предъявителю, какая половина неверна.

Index

Constants

View Source
const IntrospectPath = "/internal/tokens/introspect"

IntrospectPath — путь авторитета на cluster-внутреннем слушателе.

Внутренний по решению, а не по привычке: он принимает предъявленный токен, а значит доступен всякому, кто такой токен добыл. Наружу его не выставляем.

Variables

This section is empty.

Functions

func NewMux

func NewMux(h http.Handler) *http.ServeMux

NewMux монтирует авторитет на его путь.

Types

type Config

type Config struct {
	// Issuer — наш издатель. Токен, объявляющий другого, этому авторитету не
	// принадлежит, и он про него не судит.
	Issuer      string
	Keys        KeySetSource
	Revocations RevocationReader
	Clock       func() time.Time
	Logger      *slog.Logger
	// RequireClientCert — принимать вопрос ТОЛЬКО от пира, предъявившего
	// проверенный сертификат.
	//
	// Обязательно на всяком поднятом стенде, и вот почему это не педантизм.
	// Соседняя поверхность того же слушателя — набор проверочных ключей —
	// намеренно не требует ничего: на проводе только публичный материал, и
	// потребитель обязан оставаться origin-agnostic. У ЭТОЙ поверхности
	// предмет другой: ей ПРИСЫЛАЮТ предъявленный токен. Обоснование снятия
	// authN, выданное набору ключей, сюда не распространяется, и молчаливое
	// пользование им было бы тем самым запрещённым допущением «внутреннее —
	// значит доверенное».
	//
	// Транспорт при этом сертификат лишь ЗАПРАШИВАЕТ (иначе набор ключей стал
	// бы недоступен потребителю без сертификата), поэтому отказывать обязан
	// сам обработчик — считать, что за него это сделал транспорт, нельзя.
	RequireClientCert bool
}

Config — настройка авторитета.

type Handler

type Handler struct {
	// contains filtered or unexported fields
}

Handler — авторитет отзыва.

func NewHandler

func NewHandler(cfg Config) *Handler

NewHandler — построитель.

func (*Handler) DeclaredChecks

func (h *Handler) DeclaredChecks() []tokenpolicy.Check

DeclaredChecks возвращает состав проверок ЭТОГО проверяющего.

Объявление существует затем, чтобы его можно было СВЕРИТЬ с единым перечнем (`tokenpolicy.MandatoryChecks`), а не читать три реализации глазами. Запись, которой проверяющий не исполняет, отсюда нельзя: тогда объявление станет вторым местом об одном предмете, и разойдётся оно молча.

func (*Handler) DeclaredDeviations

func (h *Handler) DeclaredDeviations() []tokenpolicy.Deviation

DeclaredDeviations — обязательные проверки, которых интроспекция НЕ исполняет, вместе с причиной. Пустая причина не засчитывается: отступление без неё неотличимо от пропуска.

Обе причины — про РАЗНИЦУ ВОПРОСА, а не про очередь работ. Интроспекция отвечает о состоянии токена У ЕГО ИЗДАТЕЛЯ («выпущен нами, подписан, не истёк, не отозван»), а не о пригодности токена ДЛЯ ЗАДАЮЩЕГО ВОПРОС. Адресат и тип — свойства поверхности предъявления, и проверяет их та поверхность, где токен предъявлен: край и проверяющий реестра исполняют обе.

func (*Handler) ServeHTTP

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request)

func (*Handler) Stats

func (h *Handler) Stats() Stats

Stats возвращает величины.

type KeySetSource

type KeySetSource interface {
	PublishedSet(ctx context.Context) ([]domain.PublishedKey, error)
}

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

type RevocationReader

type RevocationReader interface {
	RevokedBefore(ctx context.Context, subject string) (time.Time, bool, error)
}

RevocationReader — хранилище отзывов субъектов.

Отвечает «с какого момента токены субъекта недействительны». Отсутствие записи — законный ответ «отзыва нет», а НЕ ошибка: пустое обязано означать пусто.

type Stats

type Stats struct {
	Active      uint64
	Inactive    uint64
	Unavailable uint64
}

Stats — величины по каждому исходу. «Ноль отказов за всё время жизни» обязано быть отличимо от «контроль не исполнялся».

Jump to

Keyboard shortcuts

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