IZEK API — документация авторизации
IZEK API позволяет сторонним сайтам авторизовывать пользователей через аккаунт IZEK и получать базовую информацию профиля.
1. Общая информация
IZEK API OAuth — это вход на внешние сайты через аккаунт IZEK. Работает по стандартной схеме OAuth 2.0 Authorization Code: внешний сайт перенаправляет пользователя на IZEK, пользователь подтверждает доступ, после чего сайт получает временный код, меняет его на access token и запрашивает профиль.
2. Создание API-приложения
Перед интеграцией создайте приложение в панели управления. После создания вы получите Client ID и Client Secret. Секретный ключ показывается один раз — сохраните его сразу.
| Поле | Что указать |
|---|---|
| Название | Название сайта или приложения, которое увидит пользователь при подтверждении входа. |
| Redirect URI | Полный HTTPS-адрес callback-страницы на внешнем сайте, например https://site.ru/auth/izek/callback. |
| Homepage URL | Главная страница сайта-партнёра. Используется для информации. |
| Описание | Краткое описание, зачем приложению нужен вход через IZEK. |
https://site.ru/callback и https://site.ru/callback/ считаются разными адресами.3. Схема авторизации
- Пользователь нажимает кнопку «Войти через IZEK» на внешнем сайте.
- Внешний сайт перенаправляет пользователя на
/api/oauth/authorize. - Пользователь входит в аккаунт IZEK и подтверждает доступ.
- IZEK возвращает пользователя на
redirect_uriс параметромcode. - Внешний сайт отправляет
codeна/api/oauth/tokenи получаетaccess_token. - Внешний сайт запрашивает
/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 с сохранённым.
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/"
}
avatar, оно равно avatar_url.
| Поле | Описание |
|---|---|
id | Внутренний ID пользователя IZEK. |
email | Email пользователя, если доступен 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_custom | true, если пользователь загрузил собственный аватар; false, если используется fallback. |
profile_url | Ссылка на IZEK. |
8. Готовые интеграции
Для популярных CMS и фреймворков можно использовать готовые модули авторизации через аккаунт IZEK. Это ускоряет подключение OAuth и уменьшает риск ошибок при обработке code, access_token и userinfo.
InstantCMS
Компонент IZEK Auth добавляет на сайт кнопку входа через IZEK, выполняет OAuth-авторизацию, получает профиль пользователя и передаёт аватар из API.
Быстрый старт для InstantCMS
- Скачайте архив компонента instantcms_izekauth_1.0.0.zip.
- Установите компонент через панель управления InstantCMS.
- На IZEK откройте Панель управления → API-приложения и создайте новое приложение.
- В Redirect URI укажите callback сайта:
https://ваш-сайт.ru/izekauth/callback. - Скопируйте
Client IDиClient Secretв настройки компонента IZEK Auth. - Сохраните настройки и проверьте вход через кнопку «Войти через IZEK».
| Возможность | Описание |
|---|---|
| Вход через IZEK | Пользователь авторизуется на внешнем сайте через аккаунт IZEK. |
| Регистрация | Если пользователя нет на внешнем сайте, компонент может создать локальный аккаунт. |
| Привязка по email | Если email уже существует, можно привязать вход IZEK к существующему пользователю. |
| Аватар | Компонент использует поля avatar_url, avatar_small, avatar_medium, avatar_large из /api/userinfo. |
| Совместимость | InstantCMS 2.18.x, PHP 8.1+. |
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_client | 401 | Неверный client_id или client_secret. |
unsupported_grant_type | 400 | Передан неподдерживаемый grant_type. |
invalid_grant | 400 | Код авторизации неверный, просрочен, уже использован или redirect URI не совпадает. |
invalid_token | 401 | Не передан Bearer token, токен неверный или истёк. |
user_not_found | 404 | Пользователь, связанный с токеном, не найден. |
access_denied | 302 | Пользователь отказался выдать доступ. Возвращается на redirect_uri. |
11. Безопасность
- Используйте только HTTPS для внешнего сайта и Redirect URI.
- Храните
client_secretтолько на сервере. Никогда не вставляйте его в HTML или JS. - Всегда передавайте и проверяйте
state, чтобы защититься от CSRF. - Не храните access token в открытом виде и не пишите его в публичные логи.
- Проверяйте, что
emailпользователя подтверждён на вашей стороне, если от этого зависит безопасность. - При компрометации ключей отключите приложение и создайте новое.
12. Ограничения и совместимость
| Поддерживаемые scope | profile, email |
| Срок жизни authorization code | 5 минут |
| Срок жизни access token | 3600 секунд |
| Тип токена | Bearer |
| Формат ответов | application/json; charset=utf-8 |