OAuth 2.0 · Authorization Code

Авторизация через IZEK

Серверный сценарий для входа на сторонний сайт. Пользователь видит запрошенные права и сам решает, разрешить доступ или отказаться.

5 минут действует code1 час действует access tokenJSON · UTF-8 формат ответов
1

Создайте приложение

Откройте API-приложения, укажите название и точный адрес возврата. Для обычного сайта нужен HTTPS; HTTP разрешён только для localhost, 127.0.0.1 и ::1.

Client Secret показывается один раз.Сохраните его в переменной окружения или менеджере секретов. В JavaScript и публичный репозиторий его помещать нельзя.
2

Перенаправьте пользователя

GEThttps://izek.ru/api/oauth/authorize
response_typeобязательный

Только значение code.

client_idобязательный

Идентификатор из карточки приложения.

redirect_uriобязательный

Полностью совпадает с адресом в настройках.

scopeрекомендуется

Права через пробел: profile email.

stateобязателен для безопасности

Случайное значение, связанное с сессией.

Пример URL
https://izek.ru/api/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=https%3A%2F%2Fexample.ru%2Fauth%2Fizek&scope=profile%20email&state=RANDOM_STATE

После разрешения доступа IZEK вернёт пользователя на redirect_uri?code=…&state=…. При отказе вернётся error=access_denied.

3

Обменяйте code на токен

POSThttps://izek.ru/api/oauth/token
grant_typeобязательный

authorization_code

codeобязательный

Одноразовый код из callback.

client_idобязательный

ID вашего приложения.

client_secretобязательный

Секрет приложения, только сервер-сервер.

redirect_uriобязательный

Тот же адрес, что был в первом запросе.

cURL
curl -X POST 'https://izek.ru/api/oauth/token' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=authorization_code' \
  --data-urlencode 'code=CODE_FROM_CALLBACK' \
  --data-urlencode 'client_id=CLIENT_ID' \
  --data-urlencode 'client_secret=CLIENT_SECRET' \
  --data-urlencode 'redirect_uri=https://example.ru/auth/izek'

Поля ответа

access_tokenBearer-токен для API-запросов.
token_typeВсегда Bearer.
expires_inСрок жизни в секундах, обычно 3600.
scopeФактически выданные права.
refresh_tokenПоле совместимости. Обновление через refresh_token пока не поддерживается; после истечения начните авторизацию заново.
4

Получите профиль

GEThttps://izek.ru/api/userinfo
Запрос
curl 'https://izek.ru/api/userinfo' \
  -H 'Authorization: Bearer ACCESS_TOKEN'

Параметры ответа

subСтроковый идентификатор пользователя.
idЧисловой идентификатор; нужен scope profile.
usernameЛогин пользователя.
nameОтображаемое имя.
avatar, avatar_urlАбсолютная ссылка на актуальный аватар.
avatar_small, avatar_medium, avatar_largeСовместимые ссылки для разных размеров.
avatar_originalОригинал пользовательского изображения, если он загружен.
avatar_has_customtrue, если пользователь установил свой аватар.
profile_urlАдрес профиля в IZEK.
emailВозвращается только со scope email.
Пример JSON
{
  "sub": "42",
  "id": 42,
  "username": "alex",
  "name": "Алексей",
  "avatar_url": "https://izek.ru/avatar?id=42&v=…",
  "avatar_has_custom": true,
  "profile_url": "https://izek.ru/",
  "email": "alex@example.ru"
}
!

Ошибки и ограничения

invalid_clientНе найден Client ID или не совпал Secret.
invalid_grantCode истёк, уже использован или выпущен для другого callback.
invalid_tokenBearer-токен отсутствует, истёк или отозван.
unsupported_grant_typeПоддерживается только authorization_code.
rate_limitedСлишком много запросов. Повторите позже.

Перед обменом кода сравните полученный state с сохранённым значением. Не записывайте токены и Secret в URL или клиентские логи.

icms
Готовая интеграция

Компонент для InstantCMS

Добавляет вход через IZEK ID, связывает пользователя по email и синхронизирует аватар. Поддерживаются InstantCMS 2.18.1+ и PHP 8.1+.

  1. Установите ZIP через панель InstantCMS.
  2. Создайте в IZEK API-приложение и скопируйте callback компонента в поле redirect_uri.
  3. Укажите Client ID, Client Secret и базовый адрес https://izek.ru.
  4. Оставьте scopes profile email.
Скачать компонент