tokenrevocation

package
v0.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 27, 2026 License: AGPL-3.0 Imports: 4 Imported by: 0

Documentation

Overview

Package tokenrevocation — ПРАВИЛО отзыва наших токенов, объявленное один раз.

Почему правило вынесено, а не повторено

Отзыв читают ДВЕ поверхности: авторитет отзыва, отвечающий на вопрос соседа, и читатель предъявленного на публичном слушателе. Правило у них одно, и оно нетривиально: ключей отсечки несколько, отзыв субъекта и клиента действует ВПЕРЁД, отзыв семейства — по записи выпуска и при любой отметке выпуска, а токен без отметки выпуска не сопоставим ни с какой отсечкой.

Вторая копия разошлась бы молча и разошлась бы там, где расхождение не видно: имя, заведённое в составе утверждений и забытое в одной из копий, даёт клиента, чей отзыв доезжает до одной поверхности и не доезжает до другой, — при том что обе зелены на своих пробах, потому что их фикстуры чеканят состав сами.

Исходов ТРИ, а не два

Отозван · не отозван · СПРОСИТЬ НЕ СМОГЛИ. Третий возвращается ошибкой и никогда не сливается со вторым: смешать их значило бы сделать сбой хранилища неотличимым от отсутствия отзыва, то есть завести мягкий проход при отказе зависимости.

Отзыв семейства — ЧАСТЬ правила, а не второй читатель (kaname#319)

Выпуск собственной церемонии принадлежит семейству, и отзыв семейства снимает каждый его токен. Этот вопрос задаётся ЗДЕСЬ, тем же вызовом, что отсечки по ключам: поверхность, спросившая правило, получила и ответ о семействе — с тем же окном кеша и той же политикой на неответ. Отдельное обращение за семейством у поверхности означало бы два читателя одного решения; порт чтения семейства поэтому зовёт только это правило (гейт `internal/check` `TestFamilyVerdictHasOneReaderAndEverySurfaceAsksTheRule`).

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func FamilyRevoked added in v0.5.0

func FamilyRevoked(ctx context.Context, r FamilyReader, jti string) (bool, error)

FamilyRevoked — половина правила о семействе: отозвано ли семейство выпуска с этим идентификатором.

Материал без идентификатора выпуском семейства не бывает — запись выпуска ключуется идентификатором, — поэтому хранилище о нём не спрашивается, и ответ «нет». Это не мягкий проход: такой материал судят отсечки по ключам (`Revoked`), а семейства, способного его отозвать, у него нет by construction.

func Revoked

func Revoked(ctx context.Context, r Reader, claims jwt.MapClaims) (bool, error)

Revoked отвечает, отозван ли токен с этим составом утверждений: отсечкой по любому из его ключей либо отзывом семейства, которому принадлежит выпуск.

Возвращаемая ошибка — ТРЕТИЙ исход, «спросить не смогли»: вызывающий обязан закрыться сам, а не читать её как «не отозван».

Токен БЕЗ отметки выпуска считается отозванным. Он не сопоставим ни с какой отсечкой — ни с уже стоящей, ни с будущей, — поэтому принять его значило бы завести материал, который отозвать нечем; при сомнении отказ.

Types

type FamilyReader added in v0.5.0

type FamilyReader interface {
	FamilyRevoked(ctx context.Context, jti string) (bool, error)
}

FamilyReader — хранилище принадлежности выпуска семейству.

Отвечает «отозвано ли семейство, которому принадлежит выпуск с этим идентификатором». Отозвано — и когда семейство отозвано, и когда его строки больше нет: снятое семейство живых выпусков не оставляет. Выпуск, семейству не принадлежащий, — законный ответ «нет», а не ошибка.

type Reader

type Reader interface {
	RevokedBefore(ctx context.Context, subject string) (time.Time, bool, error)
	FamilyReader
	// PersonMarks — второй вопрос правила (kaname#456, Р5а): токен, чей
	// субъект — человек с неподтверждённым адресом, недействителен. Вопрос
	// задаётся тому же предикату допуска, что у двери решения (`admission`);
	// своего чтения отметки у правила нет, и копии в поверхности нет.
	admission.Marks
}

Reader — хранилище отсечек.

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

Хранилище отвечает и о СЕМЕЙСТВЕ выпуска: порт встроен, а не отдельный, чтобы поверхность не могла получить правило без ответа о семействе — непровязанный ответ о семействе был бы непровязанным отзывом, неотличимым от «не отозван».

Jump to

Keyboard shortcuts

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