В этом руководстве один upstream API ставится за edge, и браузерное приложение вызывает его с cookie сессии. В конце пользователь читает свои заказы, не может читать чужие, а у вас есть команды curl, которые это доказывают. Нужна работающая установка с тенантом, привязанным к edge, и ваш API, доступный для edge по сети.
В примере используются эти имена. Замените их своими.
| Что | Значение |
|---|---|
Публичный адрес edge (edge-url) | https://edge.example.com |
Публичный адрес auth | https://id.example.com |
| Ваше браузерное приложение | https://app.example.com |
| Upstream API | http://orders.internal.example.com:8080 |
| ID ресурса | orders-api |
| Клиент | acme-web |
| Разрешение, роль | orders:read, customer |
| Пресет | web |
Предварительные условия
- Установка с
central,authиedge(Запуск Versola локально). - Тенант с нужным профилем, привязанный к вашему edge в разделе Tenants. См. Профили безопасности.
- В
centralнастроен бэкенд УЦ для клиентских сертификатов, потому что веб-клиент заedgeполучает выпущенный сертификат (Клиентские сертификаты edge). Цели CLI настраивают его сами. - Upstream API с двумя маршрутами:
GET /ordersиGET /users/{userId}/orders.
1. Зарегистрируйте ресурс
-
Откройте Resources и нажмите + Create Resource.
-
Укажите Resource ID
orders-apiи Absolute resource URIhttp://orders.internal.example.com:8080. В URI нет пути, query и фрагмента. -
В поле Audience добавьте клиента
acme-web, когда создадите его (шаг 3). К этому полю можно вернуться позже. -
Выберите тип internal. Тогда
edgeвызывает ваш API с HTTP Basic-учётными данными и никогда не пересылает токен пользователя. -
Нажмите Add endpoint и добавьте
GET /orders. Правила оставьте пустыми. -
Добавьте второй эндпоинт,
GET /users/{userId}/orders. В Allow (CEL) введите:request.path.params.userId == token.sub -
Нажмите Create Resource и скопируйте секрет, который покажет баннер. Он показывается один раз. Настройте ваш API на Basic-аутентификацию: пользователь
orders-api, пароль — этот секрет. Подробности в Как зарегистрировать ресурс.
Правило сравнивает userId из URL с claim sub токена вызывающего. Остальные поля и переменные описаны в разделе Политики эндпоинтов.

2. Выдайте доступ через разрешение и роль
Пока эндпоинт не покрыт разрешением, он отвечает 403.
- Откройте Permissions, создайте
orders:readи привяжите оба эндпоинтаorders-api(Как зарегистрировать разрешение). - Откройте Roles, создайте
customerи добавьте в неёorders:read(Как зарегистрировать роль). - Откройте Users и назначьте тестовому пользователю роль
customer.
3. Создайте клиента и пресет авторизации
-
Откройте Clients и запустите мастер создания. На первом шаге выберите Web app и задайте ID клиента
acme-web. -
Добавьте redirect URI
https://edge.example.com/complete. Это маршрут/completeвedge, который принимает код отauth. -
Завершите мастер и вернитесь в поле Audience ресурса, чтобы добавить
acme-web, если вы пропустили это раньше (Как зарегистрировать клиента). -
В клиенте откройте Authorization Presets и нажмите + Add Preset:
Поле Значение Preset ID webRedirect URI https://edge.example.com/completeScopes openidResponse Type codePost-login redirect URI https://app.example.com/Post-logout redirect URI (optional) https://app.example.com/logged-outSession cookie domain, path (optional) оставьте пустыми: cookie на хосте edge, путь/ -
Нажмите Save Presets.
edgeзагружает пресеты вместе с остальной конфигурацией, так что подождите доconfiguration-cache-refresh-interval(по умолчанию генерируется 5 минут, локально 1 минута).
4. Направьте браузерное приложение на edge
- Вход. Отправьте браузер на
https://edge.example.com/login/web. После входа он вернётся наhttps://app.example.com/и будет держать cookieEDGE_SESSION, которую JavaScript прочитать не может. Чтобы потребовать свежий или более сильный вход, добавьте в URLacr_valuesилиmax_age. - Вызов API. Запрашивайте
https://edge.example.com/resources/orders-api/ordersсcredentials: 'include'. Часть после/resources/orders-apiсопоставляется с зарегистрированными эндпоинтами. - Один сайт, один origin. Cookie имеет
SameSite=Strict, поэтому приложение иedgeдолжны быть на одном сайте.edgeне отправляет заголовки CORS, поэтому отдавайте приложение иedgeс одного origin, например маршрутизируйте/resources/*и/login/*с прокси вашего сайта наedge. - Истёкшая сессия. Если cookie нельзя обновить,
edgeотвечает401с заголовкомLocation: /login/web. Перейдите по нему. - Выход. Отправьте браузер на
https://edge.example.com/logout/web.
5. Проверьте через curl
Войдите в браузере и скопируйте значение cookie EDGE_SESSION из инструментов разработчика. Оно имеет вид web:<access token>. ID пользователя, то есть claim sub, возьмите из токена или из раздела Users. Токен, привязанный к сертификату edge, работает только из cookie, поэтому отправляйте его как cookie, а не как Authorization: Bearer.
Прочитайте свои заказы:
curl -i -H "Cookie: EDGE_SESSION=web:<access token>" \
https://edge.example.com/resources/orders-api/users/<your-user-id>/orders
HTTP/1.1 200 OK
...
Тело — то, что вернёт ваш API. Теперь запросите чужие заказы:
curl -i -H "Cookie: EDGE_SESSION=web:<access token>" \
https://edge.example.com/resources/orders-api/users/<another-user-id>/orders
HTTP/1.1 403 Forbidden
Правило вернуло false. edge пишет в лог access_rule_denied для этого запроса и не отправляет тело. Upstream вызова не видел. Без учётных данных:
curl -i https://edge.example.com/resources/orders-api/orders
HTTP/1.1 401 Unauthorized
Путь, под который не подходит ни один эндпоинт, при действующей сессии даёт 404.
Если не работает
| Что вы видите | Что проверить |
|---|---|
404 на /login/web | Пресет не сохранён или edge ещё не перечитал конфигурацию. Подождите один интервал обновления |
403 на каждый вызов | У роли нет разрешения или разрешение не привязано к эндпоинту. Код permission_denied в логе edge это подтверждает. Изменения ролей и разрешений тоже доходят до одного интервала обновления |
403 с audience_denied в логе | Клиента нет в Audience ресурса |
403 на ваши собственные заказы | token.sub — не тот ID пользователя, что в URL |
500 | Правило не вычисляется. Ищите access_rule_failed в логе |
Ваш API отвечает 401 | Он не принимает Basic-учётные данные orders-api:<secret> |
Что дальше
- Политики эндпоинтов: подстановка заголовков идентичности, step-up для чувствительных эндпоинтов.
- Обзор edge: что
edgeделает с каждым запросом. - Как собрать поток нативного мобильного приложения: тот же API для мобильного приложения.