OAuth 2.0 / Authorization Code

IZEK API — документация авторизации

IZEK API позволяет сторонним сайтам авторизовывать пользователей через аккаунт IZEK и получать базовую информацию профиля.

ПротоколOAuth 2.0
FlowAuthorization Code
ФорматJSON / UTF-8
ТокенBearer, 1 час

1. Общая информация

IZEK API OAuth — это вход на внешние сайты через аккаунт IZEK. Работает по стандартной схеме OAuth 2.0 Authorization Code: внешний сайт перенаправляет пользователя на IZEK, пользователь подтверждает доступ, после чего сайт получает временный код, меняет его на access token и запрашивает профиль.

API подходит для кнопки «Войти через IZEK», личных кабинетов партнёров, форумов, сервисов комментариев и других сайтов, где нужна авторизация через единый аккаунт.

2. Создание API-приложения

Перед интеграцией создайте приложение в панели управления. После создания вы получите Client ID и Client Secret. Секретный ключ показывается один раз — сохраните его сразу.

ПолеЧто указать
НазваниеНазвание сайта или приложения, которое увидит пользователь при подтверждении входа.
Redirect URIПолный HTTPS-адрес callback-страницы на внешнем сайте, например https://site.ru/auth/izek/callback.
Homepage URLГлавная страница сайта-партнёра. Используется для информации.
ОписаниеКраткое описание, зачем приложению нужен вход через IZEK.
Redirect URI должен совпадать полностью: протокол, домен, путь и слеш в конце. https://site.ru/callback и https://site.ru/callback/ считаются разными адресами.

3. Схема авторизации

  1. Пользователь нажимает кнопку «Войти через IZEK» на внешнем сайте.
  2. Внешний сайт перенаправляет пользователя на /api/oauth/authorize.
  3. Пользователь входит в аккаунт IZEK и подтверждает доступ.
  4. IZEK возвращает пользователя на redirect_uri с параметром code.
  5. Внешний сайт отправляет code на /api/oauth/token и получает access_token.
  6. Внешний сайт запрашивает /api/userinfo с заголовком Authorization: Bearer ACCESS_TOKEN.

4. Быстрый старт

Минимальная ссылка для кнопки входа:

<a href="https://izek.ru/api/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=https%3A%2F%2Fsite.ru%2Fauth%2Fizek%2Fcallback&scope=profile%20email&state=RANDOM_STATE">
  Войти через IZEK
</a>

state должен быть случайной строкой, сохранённой в сессии внешнего сайта. После возврата сравните полученный state с сохранённым.

5. Endpoint авторизации

GET /api/oauth/authorize

ПараметрОбяз.Описание
response_typeДаВсегда code.
client_idДаИдентификатор приложения из панели управления.
redirect_uriДаCallback URL. Должен совпадать с Redirect URI приложения.
scopeНетЗапрашиваемые права: profile, email. По умолчанию profile email.
stateРеком.Случайная строка для защиты от CSRF.
GET https://izek.ru/api/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=https%3A%2F%2Fsite.ru%2Fauth%2Fizek%2Fcallback&scope=profile%20email&state=RANDOM_STATE

После подтверждения IZEK перенаправит пользователя обратно:

https://site.ru/auth/izek/callback?code=AUTH_CODE&state=RANDOM_STATE

6. Получение access token

POST /api/oauth/token

Запрос выполняется сервером внешнего сайта. Не отправляйте client_secret из браузера.

POST https://izek.ru/api/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=AUTH_CODE&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&redirect_uri=https%3A%2F%2Fsite.ru%2Fauth%2Fizek%2Fcallback

Успешный ответ:

{
  "access_token": "eyJ...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "profile email"
}
  • authorization code живёт 5 минут и используется только один раз.
  • access_token живёт 1 час.
  • Если redirect_uri при обмене отличается от исходного, будет ошибка.

7. Получение профиля пользователя

GET /api/userinfo

GET https://izek.ru/api/userinfo
Authorization: Bearer ACCESS_TOKEN

Пример ответа:

{
  "id": 15,
  "email": "user@example.com",
  "username": "user",
  "name": "Имя пользователя",
  "avatar": "https://izek.ru/uploads/avatars/user_256x256.jpg",
  "avatar_url": "https://izek.ru/uploads/avatars/user_256x256.jpg",
  "avatar_small": "https://izek.ru/uploads/avatars/user_64x64.jpg",
  "avatar_medium": "https://izek.ru/uploads/avatars/user_128x128.jpg",
  "avatar_large": "https://izek.ru/uploads/avatars/user_256x256.jpg",
  "avatar_original": "https://izek.ru/uploads/avatars/user.jpg",
  "avatar_has_custom": true,
  "profile_url": "https://izek.ru/"
}
Аватар передаётся как абсолютный URL. Если у пользователя нет загруженного аватара, API вернёт Gravatar по email. Для совместимости оставлено старое поле avatar, оно равно avatar_url.
ПолеОписание
idВнутренний ID пользователя IZEK.
emailEmail пользователя, если доступен scope email.
usernameЛогин пользователя IZEK.
nameОтображаемое имя пользователя.
avatarОсновной URL аватара. Оставлено для обратной совместимости.
avatar_urlОсновной URL аватара, рекомендуемое поле для интеграции.
avatar_smallАватар 64×64 для компактных кнопок и списков.
avatar_mediumАватар 128×128 для профиля.
avatar_largeАватар 256×256 для крупных карточек.
avatar_originalОригинальный файл аватара, если он загружен на IZEK.
avatar_has_customtrue, если пользователь загрузил собственный аватар; false, если используется fallback.
profile_urlСсылка на IZEK.

8. Готовые интеграции

Для популярных CMS и фреймворков можно использовать готовые модули авторизации через аккаунт IZEK. Это ускоряет подключение OAuth и уменьшает риск ошибок при обработке code, access_token и userinfo.

ICMS

InstantCMS

Компонент IZEK Auth добавляет на сайт кнопку входа через IZEK, выполняет OAuth-авторизацию, получает профиль пользователя и передаёт аватар из API.

InstantCMS 2.18.x OAuth 2.0 Аватар через API Автоматическая регистрация

Быстрый старт для InstantCMS

  1. Скачайте архив компонента instantcms_izekauth_1.0.0.zip.
  2. Установите компонент через панель управления InstantCMS.
  3. На IZEK откройте Панель управления → API-приложения и создайте новое приложение.
  4. В Redirect URI укажите callback сайта: https://ваш-сайт.ru/izekauth/callback.
  5. Скопируйте Client ID и Client Secret в настройки компонента IZEK Auth.
  6. Сохраните настройки и проверьте вход через кнопку «Войти через IZEK».
ВозможностьОписание
Вход через IZEKПользователь авторизуется на внешнем сайте через аккаунт IZEK.
РегистрацияЕсли пользователя нет на внешнем сайте, компонент может создать локальный аккаунт.
Привязка по emailЕсли email уже существует, можно привязать вход IZEK к существующему пользователю.
АватарКомпонент использует поля avatar_url, avatar_small, avatar_medium, avatar_large из /api/userinfo.
СовместимостьInstantCMS 2.18.x, PHP 8.1+.
Актуальная версия компонента: instantcms_izekauth 1.0.0. Ссылка на скачивание ведёт на локальный файл IZEK, поэтому компонент можно скачать прямо со страницы документации.

9. Примеры интеграции

PHP: обмен code на token

$post = http_build_query([
    'grant_type'    => 'authorization_code',
    'code'          => $_GET['code'],
    'client_id'     => 'CLIENT_ID',
    'client_secret' => 'CLIENT_SECRET',
    'redirect_uri'  => 'https://site.ru/auth/izek/callback',
]);

$context = stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
        'content' => $post,
        'timeout' => 10,
    ]
]);

$response = file_get_contents('https://izek.ru/api/oauth/token', false, $context);
$token = json_decode($response, true);

PHP: получение userinfo

$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => 'Authorization: Bearer ' . $token['access_token'] . "\r\n",
        'timeout' => 10,
    ]
]);

$response = file_get_contents('https://izek.ru/api/userinfo', false, $context);
$user = json_decode($response, true);

PHP: сохранение аватара на стороне сайта

$avatarUrl = $user['avatar_url'] ?? $user['avatar'] ?? '';

if ($avatarUrl) {
    // Можно сохранить URL в профиль пользователя
    // или скачать файл на свой сервер, если это нужно вашей CMS.
    $avatarBinary = file_get_contents($avatarUrl);
    file_put_contents(__DIR__ . '/uploads/izek-avatar-' . (int)$user['id'] . '.jpg', $avatarBinary);
}

JavaScript / Node.js

const params = new URLSearchParams({
  grant_type: 'authorization_code',
  code: code,
  client_id: 'CLIENT_ID',
  client_secret: 'CLIENT_SECRET',
  redirect_uri: 'https://site.ru/auth/izek/callback'
});

const tokenResponse = await fetch('https://izek.ru/api/oauth/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: params
});

const token = await tokenResponse.json();

const userResponse = await fetch('https://izek.ru/api/userinfo', {
  headers: { Authorization: `Bearer ${token.access_token}` }
});

const user = await userResponse.json();

10. Ошибки API

Ошибки возвращаются в JSON-формате.

{
  "error": "invalid_client"
}
ОшибкаHTTPПричина
invalid_client401Неверный client_id или client_secret.
unsupported_grant_type400Передан неподдерживаемый grant_type.
invalid_grant400Код авторизации неверный, просрочен, уже использован или redirect URI не совпадает.
invalid_token401Не передан Bearer token, токен неверный или истёк.
user_not_found404Пользователь, связанный с токеном, не найден.
access_denied302Пользователь отказался выдать доступ. Возвращается на redirect_uri.

11. Безопасность

  • Используйте только HTTPS для внешнего сайта и Redirect URI.
  • Храните client_secret только на сервере. Никогда не вставляйте его в HTML или JS.
  • Всегда передавайте и проверяйте state, чтобы защититься от CSRF.
  • Не храните access token в открытом виде и не пишите его в публичные логи.
  • Проверяйте, что email пользователя подтверждён на вашей стороне, если от этого зависит безопасность.
  • При компрометации ключей отключите приложение и создайте новое.

12. Ограничения и совместимость

Поддерживаемые scopeprofile, email
Срок жизни authorization code5 минут
Срок жизни access token3600 секунд
Тип токенаBearer
Формат ответовapplication/json; charset=utf-8