Интеграция Keycloak с e-commerce (ECOM) платформой позволяет управлять пользователями, их авторизацией и доступом к корзине, заказам и персонализированному контенту. Однако, важно поддерживать анонимные (гостевые) токены для пользователей, которые ещё не вошли в систему, но уже могут добавлять товары в корзину или просматривать рекомендации.


📌 1. Архитектура интеграции Keycloak с ECOM

Основные компоненты системы:

1️⃣ Keycloak — сервер аутентификации и авторизации.
2️⃣ E-commerce Backend (API) — сервер, управляющий товарами, корзиной, заказами.
3️⃣ Frontend (SPA или Mobile App) — веб-сайт или мобильное приложение.
4️⃣ Anonymous Token Support — поддержка анонимных JWT-токенов.

📍Как это работает?

  1. Когда пользователь заходит на сайт, ему выдаётся анонимный токен (JWT), связанный с сессией.
  2. Если пользователь авторизуется, система заменяет анонимный токен на персональный токен Keycloak.
  3. Анонимный токен может использоваться для корзины, просмотра контента и рекомендаций.

🔑 2. Настройка Keycloak для поддержки анонимных токенов

🟢 Шаг 1: Создание клиента Keycloak для анонимных пользователей

  • В Keycloak Admin Console создайте новый клиент:
    • Client ID: ecom-anonymous
    • Access Type: public
    • Direct Access Grants: Enabled
    • Authorization: Disabled
    • Service Accounts: Disabled

🟢 Шаг 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

При первом заходе на сайт или в мобильное приложение:

  1. Frontend запрашивает анонимный токен у Keycloak.
  2. Backend использует анонимный токен для идентификации сессии пользователя.
  3. Корзина, избранное и просмотры сохраняются на backend по session_id.

Пример API-запроса с анонимным токеном:

curl -X GET "https://api.ecom.com/cart" \
     -H "Authorization: Bearer eyJhbGciOiJIUzI1..."
 

🔄 4. Переход от анонимного токена к авторизованному

Когда пользователь авторизуется через Keycloak:

  1. Frontend запрашивает код авторизации и получает персональный токен Keycloak.
  2. Backend ассоциирует анонимную корзину с user_id нового пользователя.
  3. Все действия пользователя сохраняются уже под его личным аккаунтом.

Пример запроса на авторизацию (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-эндпоинтам работу с анонимными токенами:

  1. Настроить Keycloak Authorization Policies.
  2. Проверять scope или client_id в access token.
  3. Ограничивать доступ в API Gateway (например, Kong, NGINX, Istio).

Пример политики (Keycloak Authorization Policy):

  • Разрешает доступ только аутентифицированным пользователям:
{
  "type": "role",
  "logic": "POSITIVE",
  "roles": ["user"]
}
 

📊 6. Сравнение анонимных и авторизованных токенов

Тип токенаАнонимный токенАвторизованный токен
Выдаётся черезclient_credentialsauthorization_code
Идентификаторsession_iduser_id
Время жизниКороткое (5-15 минут)Длинное (30-60 минут)
Доступ к APIОграниченный (безопасные действия)Полный (личные данные)
Корзина покупокСвязана с session_idСвязана с user_id
Используется дляГостевых пользователей, персонализацииАвторизованных клиентов

🚀 7. Итоговое решение

  1. Создать анонимный клиент в Keycloak.
  2. Выдавать анонимные токены для гостевых пользователей.
  3. Использовать анонимные токены для работы с корзиной и просмотром контента.
  4. Обновлять токены после авторизации пользователя.
  5. Ограничить API-доступ на основе типа токена.