Resource — Versola Docs
/docs
До 1.00.7.5versola.ioGitHub

Resource

Ресурс в Versola — API за edge: аудитория, тип public или internal, секрет и политика каждого эндпоинта

Ресурс (resource) — это upstream API за edge. Регистрация говорит edge, куда пересылать трафик, каким клиентам можно запрашивать токены для ресурса и какие правила действуют на каждом эндпоинте. Общая картина описана в разделе Сущности.

Resources: ID с хостом под ним, тип, первые два эндпоинта и первые два клиента. Фильтры: All, Internal, Public и Secret rotation
Таблица Resources: ID и хост каждого ресурса, тип, первые эндпоинты и первые клиенты.

Строка открывает страницу ресурса. Меню строки: Open, Copy ID и Delete resource. Поиск работает по ID, хосту, /path и METHOD /path; при поиске эндпоинта показываются ресурсы, у которых он есть.

Страница ресурса. У каждой группы свой Edit; главного действия на странице нет
Страница ресурса orders-api: General и Audience, таблица эндпоинтов, Secret и Fixed, карточка удаления.

Страница

Страница открывается только для чтения. Заголовок — ID ресурса, рядом кнопка копирования и чипы типа (Internal или Public) и, пока открыта ротация, Secret rotation. У каждой карточки свой Edit: он открывает только эту группу отдельной страницей с кнопкой Cancel и кнопкой Save, названной по группе.

КарточкаЧто показываетРедактор
GeneralResource URI и Reached at — маршрут /resources/{resourceId}/*, по которому edge пересылает запросы на URIEdit general
AudienceКлиенты, которым разрешено запрашивать токены для ресурса, и под ними по строке на каждого клиента, которому ресурс задал лимит. Метка клиента открывает этого клиентаEdit audience
EndpointsТаблица с правилами каждого эндпоинтаEdit endpoints
SecretТолько у internal-ресурсов: задан ли секрет и ждет ли активации новыйRotate secret, затем Activate new secret
FixedResource ID и Type, оба заданы при созданииНет
Delete resourceПоследняя на страницеНет

В консоли только для чтения те же карточки показаны без кнопок.

Поля

ПолеЧто этоПравила
Resource IDИмя в пути прокси: edge пересылает /resources/{resourceId}/* на URI ресурсаСтрочные латинские буквы, цифры и дефисы, первый символ — буква (^[a-z][a-z0-9-]*$). edge зарезервирован. Уникален во всей установке, а не только в тенанте. После создания не меняется
Absolute resource URIКуда edge отправляет запросАбсолютный URI со схемой и хостом, без пути (даже без завершающего /), без query и fragment. Схема resource:// зарезервирована. Позже URI можно изменить
AudienceКлиенты, которым разрешено запрашивать этот ресурсКлиенты того же тенанта, выбираются из списка с фильтром и Select all. Клиент, которого нет в списке, не получит токен для ресурса. Клиент, которого уже нет в тенанте, остается в списке, пока вы не снимете отметку
TypeInternal или PublicВыбирается при создании, потом не меняется
EndpointsПары «метод и путь», которые принимает edge, у каждой своя политикаСм. ниже

Ни консоль, ни Central API не задают максимальную длину этих значений.

Public и internal

PublicInternal
СекретНетГенерирует Versola
Что edge отправляет upstream в AuthorizationAccess token вызывающего как Bearer, без изменений. Ресурс сам его проверяетBasic: ID ресурса как имя и секрет ресурса как пароль. Токен вызывающего не пересылается
aud выданного токенаURI ресурсаresource://{resourceId}
Кто проверяет вызывающегоСам ресурс, по токенуedge. Upstream проверяет только Basic-учетные данные, поэтому держите его доступным только с edge

У обоих типов в edge одни и те же проверки: аудитория, разрешения и политика эндпоинта. Жизненный цикл запроса описан в Обзоре edge.

Лимиты для клиентов аудитории

Сколько может брать каждый клиент аудитории, говорит ресурс, а не клиент. В Edit audience под списком клиентов есть свернутый блок Rate limits: раскройте его, и появится по одной секции на каждого клиента аудитории с надписью No limit или кратким описанием; раскройте клиента, чтобы задать его лимит (Set a limit, затем Mode, Count by (The client as a whole или Each user), окна и Burst). Лимит действует на вызовы этого клиента к этому ресурсу, на любом endpoint, вместе со своими политиками лимитов edge, и действует меньший лимит. Клиент, вышедший из аудитории, теряет свой лимит. Владелец клиента ничего не задает о том, сколько тот может брать у API.

Edit audience — Rate limits: по секции на клиента, раскрыт storefront-web
Блок Rate limits страницы Edit audience с раскрытым клиентом: режим shadow, счет по пользователю, 600 запросов за 60 секунд, burst 50.

Эндпоинты и их политика

Эндпоинт — единица авторизации. У каждого есть метод (GET, POST, PUT, PATCH или DELETE) и относительный путь. Путь начинается с /. Каждый сегмент — либо литерал из букв, цифр и дефисов, либо параметр {name}, который соответствует ровно одному сегменту. Имена параметров в пути уникальны, а два эндпоинта с одним методом не могут отличаться только именами параметров. Литеральный эндпоинт приоритетнее параметризованного.

Карточка Endpoints — таблица, колонки которой отвечают на главные вопросы без открытия редактора:

КолонкаЧто показывает
EndpointМетод, путь и тег userinfo, если включен Fetch userinfo
Who may callРазрешения, покрывающие эндпоинт, через or (достаточно любого), и правило Allow либо No extra check
Step-upЗначения ACR, условие, при котором они нужны, и максимальный возраст входа (at most 5m; точное число секунд — в подсказке)
Added to the requestПравила inject в виде HEADER X-User-Id = token.sub либо Nothing
Таблица эндпоинтов: кто может вызвать, step-up и что добавляется к пересылаемому запросу — все читается на месте
Карточка Endpoints: метод, путь, разрешения, правило allow, step-up и внедряемые значения каждого эндпоинта.

Edit endpoints открывает страницу: слева список эндпоинтов, справа выбранный. Список отмечает несохраненное (New, Edited) и то, какие правила несет эндпоинт (Allow, Step-up, Inject); Add добавляет эндпоинт, а фильтр ищет по тексту, /path или METHOD /path. Справа пять панелей в том же порядке, в каком читается таблица, а свернутая Rate limit стоит последней:

ПанельПоля
RequestMethod, Relative path, Fetch userinfo: загрузить claims пользователя из auth и отдать их CEL как user. Один дополнительный вызов на запрос
Who may callRequired permission только для чтения (перечисляет разрешения, покрывающие эндпоинт) и Allow (CEL) — булево выражение, которое должно вернуть true. Пусто — дополнительной проверки нет
Step-upCondition (CEL): если вернет true, у вызывающего должно быть одно из значений Required ACR; пусто — step-up не требуется. Required ACR: значения, зарегистрированные в Step-up (ACR) на странице Security. Max auth age (seconds): отказать, если пользователь аутентифицировался раньше; пусто — без ограничения, действует независимо от условия
InjectAdd rule: каждое правило записывает вычисленное значение в заголовок, query-параметр или поле верхнего уровня JSON-тела запроса к upstream. У правила есть Target, Name и Expression (CEL)
Rate limitСвернута, потому что меняется редко: в заголовке видно, что задано (No limit или Enforce · 30 / 60 s · each user · burst 5). Set a limit добавляет лимит на частоту вызовов endpoint: Mode, Count by (The endpoint as a whole, Each client или Each user), окна и Burst. Edge применяет его вместе со своими политиками лимитов, и действует меньший лимит. В таблице endpoint с лимитом помечен limit: и его краткой записью

Ничего не отправляется до Save endpoints. Полоса под списком называет изменения (Not saved yet: GET /orders (new), POST /orders/{orderId}/refund (edited)). Сохранение отправляет удаленные эндпоинты, новые и измененные одним запросом; измененный эндпоинт остается тем же, поэтому покрывающие его разрешения остаются привязаны. Удаление эндпоинта, который покрыт разрешениями, сначала спрашивает подтверждение и называет их.

Edit endpoints: слева список отмечает изменения, справа панели правят выбранный эндпоинт
Страница Edit endpoints: список эндпоинтов с новым и измененным, панели Request, Who may call, Step-up и Inject выбранного.

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

Один эндпоинт: Allow (CEL), step-up и правило inject
Панели одного эндпоинта: правило Allow, условие step-up со значением ACR и максимальным возрастом, правило Inject.

Пока эндпоинт не покрыт разрешением, которое есть у вызывающего, ответ всем — 403.

Секрет internal-ресурса

Versola генерирует секрет при создании internal-ресурса и показывает его один раз в баннере на странице нового ресурса. Он хранится в зашифрованном виде, повторно показать его нельзя. Если секрет потерян, замените его ротацией. Если уйти со страницы, не нажав I’ve saved it, консоль сначала спросит подтверждение.

Для ротации нажмите Rotate secret на карточке Secret. Новый секрет показывается один раз. Прежний остается в силе, в заголовке появляется чип Secret rotation, а баннер сообщает A new secret was issued. Во время ротации edge продолжает аутентифицироваться прежним секретом. Научите upstream принимать оба секрета, затем нажмите Activate new secret (в баннере или на карточке) и подтвердите. После следующей синхронизации edge перейдет на новый секрет, прежний будет удален. Одновременно может идти только одна ротация.

Создание и удаление

+ Create Resource открывает одну форму из трех групп: Basics (ID и URI), Type (две карточки, Internal и Public) и Audience. Эндпоинты добавляются потом, на странице нового ресурса, где видно, какие разрешения их покрывают. Ресурс без эндпоинтов допустим. После создания открывается страница ресурса, а у internal-ресурса — баннер с секретом.

Create resource: основное, тип и аудитория в одной форме
Форма Create resource: ID, URI, тип Internal и два отмеченных клиента.

Можно менять URI, аудиторию и эндпоинты. Удаление ресурса требует подтверждения; диалог называет маршрут, который перестанет работать, и разрешения, связанные с его эндпоинтами: они сохраняют их как detached endpoints.

Что дальше