Многотенантная интеграция (единый вход)

Предисловие

Многотенантность — распространённый подход для любого облачного приложения. Стратегия единого экземпляра для разных организаций всегда эффективнее с точки зрения обслуживания и затрат.

Компонент Editor предназначен для помощи в создании и управлении визуальным представлением схемы рассадки. Этот документ охватывает все случаи, когда тикетинговая платформа предоставляет многотенантность, и желаемая модель интеграции должна поддерживать такой сценарий.

Цели

Основная цель — обеспечить бесшовную поддержку многотенантных моделей между двумя платформами. позволяет организовывать отдельные рабочие пространства для разных организаций. Для достижения существующих целей нам нужно реализовать функциональность SSO между двумя платформами.

Тенанты могут быть представлены как некие организации или клиенты в терминах тикетингового ПО.

Интеграция

Определения

Здесь и далее мы будем использовать следующие термины:

  • Ticketing Platform - TP - платформа для интеграции
  • Seatmap.pro - SMP - платформа, состоящая из двух основных компонентов:
    • Editor - UI-приложение для редактирования схем
    • Booking - API-компонент платформы, обрабатывающий аутентификацию и управление организациями

Модель

Мы привязываем пользователей к конкретному тенанту, тем самым определяя некую область или ограничение для разделения доступа между двумя или более организациями.

model

По сути, один тенант или организация может содержать несколько пользователей.

Основной поток

Рассмотрим начальный сценарий, когда аутентифицированный в TP пользователь пытается открыть UI SMP Editor. Чтобы пропустить шаг аутентификации на стороне SMP, у пользователя должны быть токены аутентификации. Чтобы связать две платформы, нужно выполнить следующие шаги:

  1. Для синхронизации организаций TP определяет организацию текущего пользователя и проверяет, что она уже существует на стороне SMP Booking и имеет некий ID.
    • Если организация не существует на стороне SMP Booking, TP должна сначала создать её с помощью API управления организациями
  2. Когда id организации известен, TP готова получить токены аутентификации с помощью метода autoLogin
  3. В результате autoLogin TP может перенаправить пользователя или открыть UI SMP Editor с полученными token и refreshToken

sequence

Создание организации

Чтобы создать организацию программно, нужно вызвать management API на стороне SMP Booking:

POST /api/private/management/v2.0/organizations/ HTTP/1.1
Host: {BOOKING_HOST}
Content-Type: application/json
Authorization: Bearer {YOUR_ACCESS_TOKEN}
Content-Length: 164

{
    "organization": {
        "name": "Organization Name"
        // other organization properties
    },
    "user": {
        "email": "jd@seatmap.pro",
        "firstName": "John",
        "lastName": "Doe"
        // other user properties
    }
}

Этот эндпоинт требует корректной аутентификации с помощью bearer-токена. Ответ будет содержать созданную организацию с её ID, который понадобится для последующих операций.

Запрос автоматического входа

Метод автоматического входа позволяет получить пользовательскую сессию. Сейчас это обрабатывается системой SMP Booking:

POST /api/public/v2.0/autologin/ HTTP/1.1
Host: {BOOKING_HOST}
Content-Type: application/json
Content-Length: 164

{
    "login": "jd@seatmap.pro",
    "firstName": "John",
    "lastName": "Doe",
    "token": "{PRIVATE_KEY}"
}

Ответ будет содержать следующую информацию:

{
  "user": {
    // User information
  },
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "sessionId": "abc123xyz"
}

Открытие приложения Editor

После получения ответа autologin вы можете открыть приложение SMP Editor в iframe, добавив token и refreshToken как параметры URL:

<iframe
  src="{EDITOR_HOST}?token={token}&refreshToken={refreshToken}"
  width="100%"
  height="800px"
  frameborder="0"
>
</iframe>

Замените {token} и {refreshToken} соответствующими значениями из ответа autologin. Это позволяет приложению SMP Editor аутентифицировать пользователя автоматически, без дополнительных шагов входа.

Пример

Допустим, вам нужно открыть Editor для конкретной схемы площадки по URL https://editor.seatmap.dev/app/venues/2/schemas/150, и вы получили из ответа autologin следующие токены:

  • token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
  • refreshToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJyZWZyZXNoIn0.eBjJJpHLlEVcKkprmYzqmh5hS5Vb5aT1QRYoD-YKfuU

Полный URL для использования в вашем iframe будет таким:

https://editor.seatmap.dev/app/venues/2/schemas/150?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U&refreshToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJyZWZyZXNoIn0.eBjJJpHLlEVcKkprmYzqmh5hS5Vb5aT1QRYoD-YKfuU

А полная реализация iframe будет такой:

<iframe
  src="https://editor.seatmap.dev/app/venues/2/schemas/150?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U&refreshToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJyZWZyZXNoIn0.eBjJJpHLlEVcKkprmYzqmh5hS5Vb5aT1QRYoD-YKfuU"
  width="100%"
  height="800px"
  frameborder="0"
>
</iframe>