client_token

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

Documentation

Overview

Package client_token — выдача токена по учётным данным клиента, чья личность доказана подписанным утверждением (задача #898, приёмка F2 §9.1 п. 5, 7).

Что здесь решается, а что уже решено выше

К моменту входа сюда клиент УЖЕ аутентифицирован: подпись сошлась с ключом из реестра, утверждение однократно, время в границах. Здесь решается другое — ВЫДАВАТЬ ЛИ ЕМУ, и это отдельный вопрос: аутентифицированный клиент может быть истёкшим, а его владелец — снятым.

Почему срок выданного токена ограничен остатком срока клиента

Отзыв обязан действовать и на предъявлении, иначе он не отзыв, а «больше не выдаём». Для истечения КЛИЕНТА читатель на пути каждого запроса стоил бы обращения к реестру ради величины, известной в момент выдачи. Ограничение срока токена остатком срока клиента даёт то же свойство ценой ОДНОГО вычисления при выдаче: токенов, переживших клиента, не существует by construction, и читать на предъявлении нечего.

Цена названа и она не нулевая: клиент, которому осталось меньше обычного срока токена, получает УКОРОЧЕННЫЙ токен и обязан быть к этому готов. Это сказано на странице документации, потому что иначе он узнает об этом укороченным токеном, который примет за сбой.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ClaimSource

type ClaimSource interface {
	ClaimsForAssertionClient(ctx context.Context, client domain.AssertionClient, hookCtx service.TokenHookContext) (map[string]any, service.ResolvedPrincipal, error)
}

ClaimSource — порт ОДНОГО объявления состава утверждений.

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

type Config

type Config struct {
	// AllowedAudiences — объявленный конфигурацией перечень адресатов
	// платформы. Пустой означал бы «любой», поэтому он обязателен.
	//
	// Это ВНЕШНЯЯ граница выдачи: перечень поверхностей, которым платформа
	// вообще чеканит удостоверения. Он объявлен посадкой, и расширить его
	// заказчик ключа не может ничем.
	//
	// Прежняя редакция этого комментария говорила, что сверка идёт с ЭТИМ
	// перечнем «и ничем больше, потому что колонки адресатов у клиентов в схеме
	// нет». Колонка теперь есть (задача #1136), и сужение поверх этого перечня
	// действует — см. `resolveAudience`. Внешней границей перечень при этом
	// быть не перестал: сужение работает внутри него.
	AllowedAudiences []string
	// DefaultAudience — адресат, когда запрос его не назвал.
	DefaultAudience string
	// TokenTTL — обычный срок выпускаемого токена.
	TokenTTL time.Duration
	// Clock — источник времени. Вход, а не окружение.
	Clock func() time.Time
}

Config — объявленная настройка выдачи. Каждое поле обязательно.

type Input

type Input struct {
	// Client — строка реестра, чью личность доказало утверждение.
	Client domain.AssertionClient
	// RequestedAudience — адресат ИЗ ЗАПРОСА. Никогда из предъявленного
	// утверждения: адресат утверждения — это идентификатор нашего издателя, и
	// перенос его в адресат выданного токена дал бы токен, адресованный нам
	// самим. Положительный путь при этом работает: токен выпускается, подпись
	// верна, клиент доволен, — а ломается у ПОТРЕБИТЕЛЯ, через несколько шагов
	// после места ошибки.
	RequestedAudience []string
	// Scope — запрошенная область.
	Scope string
	// Confirmation — привязка к ключу ВЛАДЕЛЬЦА, взятая из предъявленного при
	// выдаче доказательства владения. Никогда из ключа утверждения: это разные
	// ключи, и совпадение их — частный случай, на котором свойство не
	// измеряется.
	Confirmation *tokensigner.Confirmation
}

Input — вход выдачи.

type Output

type Output struct {
	AccessToken string
	TokenType   string
	ExpiresIn   int
	Scope       string
}

Output — выпущенный токен в форме, которую понимает стандартный клиент.

type Signer

type Signer interface {
	Sign(ctx context.Context, req tokensigner.Request) (tokensigner.Token, error)
	Issuer() string
}

Signer — порт подписанта. Определён здесь, у вызывающего.

type UseCase

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

UseCase — выдача по учётным данным клиента.

func New

func New(cfg Config, signer Signer, claims ClaimSource) (*UseCase, error)

New строит выдачу. Неполная настройка — отказ построения.

func (*UseCase) Issue

Issue выпускает токен.

Исход отказа возвращается ВМЕСТЕ с ошибкой и принадлежит тому же закрытому словарю, что исходы аутентификации: перечень исходов есть перечень счётчиков, и исход без счётчика делает мёртвый контроль невидимым.

Jump to

Keyboard shortcuts

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