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 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 строит выдачу. Неполная настройка — отказ построения.