Интеграция Keycloak с e-commerce (ECOM) платформой позволяет управлять пользователями, их авторизацией и доступом к корзине, заказам и персонализированному контенту. Однако, важно поддерживать анонимные (гостевые) токены для пользователей, которые ещё не вошли в систему, но уже могут добавлять товары в корзину или просматривать рекомендации.
📌 1. Архитектура интеграции Keycloak с ECOM
Основные компоненты системы:
1️⃣ Keycloak — сервер аутентификации и авторизации.
2️⃣ E-commerce Backend (API) — сервер, управляющий товарами, корзиной, заказами.
3️⃣ Frontend (SPA или Mobile App) — веб-сайт или мобильное приложение.
4️⃣ Anonymous Token Support — поддержка анонимных JWT-токенов.
📍Как это работает?
- Когда пользователь заходит на сайт, ему выдаётся анонимный токен (JWT), связанный с сессией.
- Если пользователь авторизуется, система заменяет анонимный токен на персональный токен Keycloak.
- Анонимный токен может использоваться для корзины, просмотра контента и рекомендаций.
🔑 2. Настройка Keycloak для поддержки анонимных токенов
🟢 Шаг 1: Создание клиента Keycloak для анонимных пользователей
- В Keycloak Admin Console создайте новый клиент:
- Client ID:
ecom-anonymous
- Access Type:
public
- Direct Access Grants:
Enabled
- Authorization:
Disabled
- Service Accounts:
Disabled
- Client ID:
🟢 Шаг 2: Настройка анонимного токена в Keycloak
Чтобы создать анонимный токен, можно использовать Client Credentials Flow с публичным клиентом.
Запрос на получение анонимного токена (cURL):
curl -X POST "https://keycloak.example.com/auth/realms/ecom/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=ecom-anonymous"
✅ Ответ (анонимный JWT-токен):
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR...",
"token_type": "bearer",
"expires_in": 300
}
⚠️ Ограничения анонимного токена:
- Нет
user_id
, но есть уникальныйsession_id
. - Можно ограничить права доступа с помощью Client Roles.
📌 3. Использование анонимного токена в e-commerce API
При первом заходе на сайт или в мобильное приложение:
- Frontend запрашивает анонимный токен у Keycloak.
- Backend использует анонимный токен для идентификации сессии пользователя.
- Корзина, избранное и просмотры сохраняются на backend по
session_id
.
Пример API-запроса с анонимным токеном:
curl -X GET "https://api.ecom.com/cart" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1..."
🔄 4. Переход от анонимного токена к авторизованному
Когда пользователь авторизуется через Keycloak:
- Frontend запрашивает код авторизации и получает персональный токен Keycloak.
- Backend ассоциирует анонимную корзину с
user_id
нового пользователя. - Все действия пользователя сохраняются уже под его личным аккаунтом.
Пример запроса на авторизацию (Authorization Code Flow):
curl -X POST "https://keycloak.example.com/auth/realms/ecom/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "client_id=ecom-client" \
-d "client_secret=your_secret" \
-d "code=xyz123" \
-d "redirect_uri=https://ecom.com/callback"
✅ Ответ (персональный JWT-токен пользователя):
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR...",
"expires_in": 3600
}
🛠️ 5. Ограничение доступа с анонимными токенами
Чтобы запретить некоторым API-эндпоинтам работу с анонимными токенами:
- Настроить Keycloak Authorization Policies.
- Проверять
scope
илиclient_id
в access token. - Ограничивать доступ в API Gateway (например, Kong, NGINX, Istio).
Пример политики (Keycloak Authorization Policy):
- Разрешает доступ только аутентифицированным пользователям:
{
"type": "role",
"logic": "POSITIVE",
"roles": ["user"]
}
📊 6. Сравнение анонимных и авторизованных токенов
Тип токена | Анонимный токен | Авторизованный токен |
---|---|---|
Выдаётся через | client_credentials | authorization_code |
Идентификатор | session_id | user_id |
Время жизни | Короткое (5-15 минут) | Длинное (30-60 минут) |
Доступ к API | Ограниченный (безопасные действия) | Полный (личные данные) |
Корзина покупок | Связана с session_id | Связана с user_id |
Используется для | Гостевых пользователей, персонализации | Авторизованных клиентов |
🚀 7. Итоговое решение
- Создать анонимный клиент в Keycloak.
- Выдавать анонимные токены для гостевых пользователей.
- Использовать анонимные токены для работы с корзиной и просмотром контента.
- Обновлять токены после авторизации пользователя.
- Ограничить API-доступ на основе типа токена.