OAuth 2.0 · Authorization Code

IZEK API

OAuth 2.0Authorization Code
5 минутсрок кода
1 часaccess token

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

В API-приложениях задайте название и точный HTTPS redirect_uri. Для localhost разрешён HTTP. Client Secret показывается только при создании или сбросе.

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

GET https://izek.ru/api/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK&scope=profile%20email&state=RANDOM_STATE

Храните state в сессии своего сайта и сравните его после возврата. Код одноразовый и действует 5 минут.

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

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=CALLBACK
{"access_token":"…","refresh_token":"…","token_type":"Bearer","expires_in":3600,"scope":"profile email"}

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

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

Scope profile даёт идентификатор, логин, имя, аватар и ссылку профиля; email добавляет email. Ответы JSON используют UTF-8.

Ошибки и безопасность

invalid_client означает неверный Client ID или Secret, invalid_grant — истёкший или уже использованный code, invalid_token — недействительный Bearer token. Не передавайте Secret в браузер и не храните access token в URL.

Пример на PHP

<?php
$params = ['grant_type' => 'authorization_code', 'code' => $_GET['code'],
  'client_id' => getenv('IZEK_CLIENT_ID'), 'client_secret' => getenv('IZEK_CLIENT_SECRET'),
  'redirect_uri' => 'https://site.ru/izek/callback'];
$response = file_get_contents('https://izek.ru/api/oauth/token', false, stream_context_create(['http' => [
  'method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
  'content' => http_build_query($params), 'ignore_errors' => true]]));
$token = json_decode($response, true, flags: JSON_THROW_ON_ERROR);

Перед обменом кода обязательно сверяйте state, который вы создали до перенаправления пользователя.

Готовый компонент для InstantCMS

Компонент добавляет кнопку «Войти с IZEK ID» на формы входа и регистрации, создаёт или связывает пользователя по email и синхронизирует аватар. Поддерживается InstantCMS 2.18.1+ и PHP 8.1+.

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

Скачать компонент InstantCMS

Справочник параметров

client_id

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

redirect_uri

Полностью совпадает с адресом из настроек приложения.

scope

Запрашиваемые права: profile, email и права Вебмастера при необходимости.

state

Случайная строка вашей сессии. Проверяйте её после возврата пользователя.

Полный пример 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'

curl 'https://izek.ru/api/userinfo' -H 'Authorization: Bearer ACCESS_TOKEN'

Токен и Client Secret должны оставаться на сервере вашего приложения. В браузер передавайте только собственную сессию сайта.

Возврат на ваш сайт

https://example.ru/auth/izek?code=AUTHORIZATION_CODE&state=RANDOM_STATE

Сначала сравните state с сохранённым значением. Затем обменяйте одноразовый code на токен серверным POST-запросом.