Documentation
¶
Overview ¶
Package tokenintrospecthttp — авторитет отзыва НАШИХ токенов на cluster-внутреннем слушателе (задача #897).
Зачем он существует ¶
Контроль, действующий на ВЫДАЧЕ и не действующий на ПРЕДЪЯВЛЕНИИ, отзывом не является: он лишь не выдаёт нового, а предъявленное продолжает проходить до истечения срока. Это состояние не сходится само — в отличие от задержки распространения, — и потому окно отзыва равнялось бы сроку токена, а не сроку, который мы выбрали.
Отсюда: у поверхности, принимающей наш токен, есть читатель отзыва НА ПУТИ ЗАПРОСА, и спрашивает он нас. Мы — единственные, кто знает про наши токены: прежний провайдер о них не знает by construction, поэтому вопрос ему был бы вопросом не про тот предмет.
Форма ответа выбрана стандартной намеренно ¶
Ответ — тот же документ, которого ждёт всякий, кто умеет спрашивать про действительность токена (RFC 7662): `{"active": true|false}`. Своя форма заставила бы переписывать каждого спрашивающего и сделала бы будущее решение о поверхности решением о переписывании.
Что этот авторитет НЕ делает ¶
Он не рассказывает, ЧЕМ токен негоден. Наружу уходит суждение, подробность — в журнал: различение подсказывало бы предъявителю, какая половина неверна.
Index ¶
Constants ¶
const IntrospectPath = "/internal/tokens/introspect"
IntrospectPath — путь авторитета на cluster-внутреннем слушателе.
Внутренний по решению, а не по привычке: он принимает предъявленный токен, а значит доступен всякому, кто такой токен добыл. Наружу его не выставляем.
Variables ¶
This section is empty.
Functions ¶
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 (*Handler) DeclaredChecks ¶
func (h *Handler) DeclaredChecks() []tokenpolicy.Check
DeclaredChecks возвращает состав проверок ЭТОГО проверяющего.
Объявление существует затем, чтобы его можно было СВЕРИТЬ с единым перечнем (`tokenpolicy.MandatoryChecks`), а не читать три реализации глазами. Запись, которой проверяющий не исполняет, отсюда нельзя: тогда объявление станет вторым местом об одном предмете, и разойдётся оно молча.
func (*Handler) DeclaredDeviations ¶
func (h *Handler) DeclaredDeviations() []tokenpolicy.Deviation
DeclaredDeviations — обязательные проверки, которых интроспекция НЕ исполняет, вместе с причиной. Пустая причина не засчитывается: отступление без неё неотличимо от пропуска.
Обе причины — про РАЗНИЦУ ВОПРОСА, а не про очередь работ. Интроспекция отвечает о состоянии токена У ЕГО ИЗДАТЕЛЯ («выпущен нами, подписан, не истёк, не отозван»), а не о пригодности токена ДЛЯ ЗАДАЮЩЕГО ВОПРОС. Адресат и тип — свойства поверхности предъявления, и проверяет их та поверхность, где токен предъявлен: край и проверяющий реестра исполняют обе.
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 — хранилище отзывов субъектов.
Отвечает «с какого момента токены субъекта недействительны». Отсутствие записи — законный ответ «отзыва нет», а НЕ ошибка: пустое обязано означать пусто.