К документации
ArisIDДля разработчиковВаш аккаунт ↗
Справочник разработчика

ArisID API

Вход в аккаунт, данные профиля и управление текущей сессией через HTTP.

JSON · UTF-8Bearer-токенСессия 30 дней

Документация доступна без авторизации. API возвращает данные только владельца переданного токена. Все примеры содержат вымышленные данные.

Базовый адрес на этом сайте: /api.php. Для интеграции замените https://idaris.tech на адрес сервера ArisID.

Обозначение v1 относится к текущему контракту. Версии в URL нет: действие выбирается параметром action.

Доступные методы
МетодАдресНазначениеТокен
POST/api.php?action=loginВойтиНет
GET/api.php?action=meПолучить профильДа
GET/api.php?action=avatarПолучить аватарДа
POST/api.php?action=logoutЗавершить сессиюДа

Регистрация, редактирование профиля, список пользователей и административные действия через это API пока не доступны. QR-вход работает в интерфейсе ArisID и не входит в публичный контракт API.

Быстрый старт

  1. Создайте аккаунт в ArisID.
  2. Отправьте логин и пароль в action=login.
  3. Сохраните полученный access_token в защищённом хранилище приложения.
  4. Передайте токен в заголовке Authorization для получения профиля.
cURL · вход (bash)
curl 'https://idaris.tech/api.php?action=login' \
  -H 'Content-Type: application/json' \
  --data '{"method":"login","identifier":"ivan","password":"YOUR_PASSWORD"}'
cURL · профиль (bash)
curl 'https://idaris.tech/api.php?action=me' \
  -H "Authorization: Bearer $ARISID_TOKEN"

ARISID_TOKEN в примерах — переменная окружения с токеном из ответа входа. Не подставляйте пароль или токен в публичный исходный код.

Вход на другом сайте без регистрации приложения

Достаточно реализовать шаги из документации. Аккаунт разработчика, создание приложения в панели, client_id, client_secret и вызов регистрации не нужны. Пользователь вводит пароль только на ArisID и подтверждает передачу профиля указанному сайту.

  1. Создайте случайный state из 64 hex-символов и code_verifier длиной 43–128 символов. Сохраните их в серверной сессии вашего сайта отдельно для каждой попытки входа.
  2. Вычислите code_challenge = BASE64URL(SHA256(code_verifier)), без символов «=».
  3. Откройте /connect с параметрами response_type=code, redirect_uri, state, code_challenge и code_challenge_method=S256. Параметры URL нужно кодировать.
  4. После возврата обязательно сравните state с сохранённым значением. При отмене приходит error=access_denied. При подтверждении — одноразовый code, действующий 120 секунд.
  5. Отправьте JSON POST на /connect/token с grant_type=authorization_code, redirect_uri, code и code_verifier. Адрес redirect_uri должен точно совпадать с первым запросом.
  6. Храните access_token на сервере и запрашивайте /api.php?action=me с заголовком Authorization: Bearer. Проверяйте права в своём приложении отдельно.
PHP · переход на ArisID
session_start();
$state = bin2hex(random_bytes(32));
$verifier = bin2hex(random_bytes(32));
$_SESSION['aris_login'][$state] = ['verifier'=>$verifier, 'created'=>time()];
$params = [
  'response_type'=>'code',
  'redirect_uri'=>'https://example.com/auth/callback',
  'state'=>$state,
  'code_challenge'=>rtrim(strtr(base64_encode(hash('sha256', $verifier, true)), '+/', '-_'), '='),
  'code_challenge_method'=>'S256',
];
header('Location: https://idaris.tech/connect?' . http_build_query($params));
exit;
JSON · обмен кода на токен
{
    "grant_type": "authorization_code",
    "redirect_uri": "https://example.com/auth/callback",
    "code": "CODE_FROM_CALLBACK",
    "code_verifier": "SAVED_VERIFIER"
}

Заголовок обмена: Content-Type: application/json. Ответ содержит access_token, token_type, expires_in (2592000) и expires_at. Повторный обмен, неверный verifier, изменённый callback и просроченный код отклоняются.

Callback: точный HTTPS URL; HTTP разрешён только для localhost, 127.0.0.1 и [::1]. Фрагменты, шаблоны, данные входа в URL и query-параметры code/state/error запрещены. На экране согласия отображается домен получателя. Запрос подтверждения действует 10 минут.

Для ранее подключённых сайтов параметры client_id и endpoint /connect/register продолжают работать. Новым интеграциям они не требуются. Выданные разрешения можно отозвать в разделе «Сессии».

Ошибки обмена: 400 invalid_request / invalid_grant, 405 method_not_allowed, 413 body_too_large, 415 json_required, 429 rate_limited. Новых callback-адресов: до 20 на IP и 500 суммарно за 15 минут.

На этом сервере установлен самоподписанный TLS-сертификат. Серверу приложения необходимо доверять этому сертификату через своё хранилище CA; не отключайте проверку TLS.

Авторизация

Используйте заголовок ниже для каждого защищённого запроса. Токен начинается с aris_, за которым следуют 64 шестнадцатеричных символа. Передавайте его точно в полученном виде.

HTTP
Authorization: Bearer aris_YOUR_ACCESS_TOKEN

Cookie личного кабинета не заменяют Bearer-токен. Токены в URL и теле запроса не принимаются. При отсутствии или неправильном формате заголовка сервер отвечает 401 unauthorized и WWW-Authenticate: Bearer.

Метод login выполняет прямой вход по паролю. Для входа на самом ArisID с возвратом в приложение используйте ArisID Connect. OpenID Connect, scopes и refresh-токены не реализованы.

POST Вход

/api.php?action=login · Токен не требуется. Заголовок Content-Type: application/json обязателен; допускается параметр charset.

Тело запроса
ПолеТипОбязательноеПравила
identifierstringДаЛогин, почта или телефон. До 254 байт. Пробелы по краям удаляются.
passwordstringДаТекущий пароль. API принимает до 128 байт; в аккаунте пароль задаётся длиной 6–32 символа. Регистр и пробелы сохраняются.
methodstringНетlogin, email, phone, auto. По умолчанию auto.

auto ищет по логину или почте. Для телефона укажите phone: 7–15 цифр, допускаются ведущий плюс, пробелы, круглые скобки и дефисы (до 30 символов). Если номер соответствует нескольким аккаунтам, войдите по логину или почте.

JSON · вход по телефону
{
    "method": "phone",
    "identifier": "+7 (999) 123-45-67",
    "password": "YOUR_PASSWORD"
}
200 OK · пример ответа
{
    "access_token": "aris_0000000000000000000000000000000000000000000000000000000000000000",
    "token_type": "Bearer",
    "expires_in": 2592000,
    "expires_at": "2026-10-18T09:00:00+00:00",
    "account": {
        "id": "id12345",
        "surname": "Иванов",
        "name": "Иван",
        "patronymic": "Иванович",
        "phone": "+79991234567",
        "login": "ivan",
        "email": "ivan@example.com",
        "discord": "",
        "telegram": "@ivan",
        "vk": "",
        "role": "user",
        "created_at": "2026-09-18T09:00:00+00:00",
        "avatar_url": "/api.php?action=avatar"
    }
}

Токен в примере не действителен. expires_in — срок в секундах, expires_at — точное время окончания в UTC. Токен возвращается только при создании сессии. Каждый успешный вход создаёт отдельную сессию.

Неверный пароль, отсутствующий или заблокированный аккаунт дают одинаковый ответ 401 invalid_credentials. Максимальный размер тела — 8192 байта.

GET Данные аккаунта

/api.php?action=me · Требуется Bearer-токен. Тело запроса не нужно. Если action не передан, используется me.

200 OK
{
    "account": {
        "id": "id12345",
        "surname": "Иванов",
        "name": "Иван",
        "patronymic": "Иванович",
        "phone": "+79991234567",
        "login": "ivan",
        "email": "ivan@example.com",
        "discord": "",
        "telegram": "@ivan",
        "vk": "",
        "role": "user",
        "created_at": "2026-09-18T09:00:00+00:00",
        "avatar_url": "/api.php?action=avatar"
    },
    "session": {
        "expires_at": "2026-10-18T09:00:00+00:00"
    }
}

Ответ содержит актуальные значения профиля. Запрос обновляет время последней активности сессии, но не продлевает её срок. Пароли, хеши и служебные ключи не возвращаются.

GET Аватар

/api.php?action=avatar · Требуется Bearer-токен. Возвращает изображение с соответствующим Content-Type: PNG, JPEG или WebP. Если своего аватара нет, возвращается стандартный PNG.

account.avatar_url — относительный путь на сервере ArisID. Для него тоже нужен заголовок Authorization; обычный <img src> его не отправляет. В браузере загрузите файл через fetch и создайте Object URL.

JavaScript · отображение аватара
const response = await fetch(`${base}?action=avatar`, {
  headers: { Authorization: `Bearer ${token}` },
  credentials: 'omit'
});
if (!response.ok) throw new Error(`Avatar: HTTP ${response.status}`);
const imageUrl = URL.createObjectURL(await response.blob());
const image = document.querySelector('#avatar');
image.onload = image.onerror = () => URL.revokeObjectURL(imageUrl);
image.src = imageUrl;

Переменные base и token задаются в примере интеграции ниже. На странице приложения нужен элемент <img id="avatar" alt="Аватар">.

POST Выход

/api.php?action=logout · Требуется Bearer-токен. Тело запроса не требуется. Завершает только сессию переданного токена.

cURL · выход (bash)
curl -X POST 'https://idaris.tech/api.php?action=logout' \
  -H "Authorization: Bearer $ARISID_TOKEN"
200 OK
{"ok":true}

После выхода удалите токен из приложения. Повторный запрос с этим токеном вернёт 401 invalid_or_expired_token.

Поля аккаунта

Объект account в ответах login и me
ПолеТипОписание
idstringПубличный ID, например id201. Без ведущих нулей.
surnamestring | nullФамилия.
namestringИмя.
patronymicstring | nullОтчество.
phonestring | nullНомер телефона.
loginstring | nullЛогин.
emailstringАдрес электронной почты.
discordstring | nullКонтакт Discord.
telegramstring | nullКонтакт Telegram.
vkstring | nullКонтакт VK.
rolestringРоль: user или owner.
created_atstringДата создания аккаунта, ISO 8601.
avatar_urlstringПуть к изображению, доступному по Bearer-токену.

Незаполненные контакты могут быть пустой строкой или null. В старых аккаунтах отдельные личные поля также могут быть null. API не сообщает, подтверждены ли почта и телефон; их наличие не означает проверку владения.

Сессии на 30 дней

В браузере ArisID вход сохраняется 30 дней с последней активности и продлевается при использовании. Переключение вкладок, закрытие браузера и очистка временных серверных сессий не завершают вход. Удаление cookie, явный выход, отзыв сессии, блокировка и смена пароля могут потребовать повторного входа.

API-токены

Срок фиксирован: 2 592 000 секунд с момента входа. Неактивность не сокращает его, запросы не продлевают. После окончания выполните вход заново.

Сессии отображаются в личном кабинете как «ArisID API». Пользователь может завершить одну сессию или все остальные. Смена или сброс пароля, блокировка аккаунта и отзыв сессии прекращают API-доступ досрочно.

Сервер хранит только SHA-256 токена. Закрытие приложения не завершает сессию; удаление локального токена не отзывает его на сервере — используйте метод выхода.

Ошибки и лимиты

Ошибки возвращаются в JSON. Проверяйте HTTP-статус до обработки данных.

401 · пример ошибки
{"error":"invalid_or_expired_token"}
Все коды ошибок
HTTPerrorПричина / действие
400invalid_jsonТело не является корректным JSON.
400invalid_inputНеверные типы, отсутствующие поля, превышенная длина или неизвестный method.
400invalid_phoneНеверный формат телефона.
401invalid_credentialsПроверьте данные входа и доступность аккаунта.
401unauthorizedПередайте корректный заголовок Authorization.
401invalid_or_expired_tokenТокен не найден, отозван, истёк или доступ аккаунта изменился. Требуется новый вход.
404not_foundНеизвестное действие action.
405method_not_allowedИспользуйте метод из заголовка Allow.
413body_too_largeТело входа больше 8192 байт.
415json_requiredДля входа нужен Content-Type: application/json.
429rate_limitedПовторите позже. Retry-After: 900 секунд.
500server_errorОшибка сервера. Повторите позже; не повторяйте вход бесконечно.

Вход ограничен 40 попытками на IP и 15 на идентификатор за 15 минут. Лимиты общие с формой входа сайта; успешные попытки тоже учитываются. Ответ 429 дополнительно содержит текстовое поле message.

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

В примере JavaScript пароль приходит из формы вашего приложения, а токен остаётся в памяти. Вызовите signIn(identifier, password) из обработчика отправки формы.

JavaScript · вход и профиль
const base = 'https://idaris.tech/api.php';
let token = null;

async function request(action, options = {}) {
  const response = await fetch(`${base}?action=${action}`, {
    ...options,
    credentials: 'omit',
    headers: {
      ...(token ? { Authorization: `Bearer ${token}` } : {}),
      ...options.headers
    }
  });
  const data = await response.json();
  if (!response.ok) {
    if (response.status === 401) token = null;
    throw new Error(data.error || `HTTP ${response.status}`);
  }
  return data;
}

async function signIn(identifier, password) {
  const session = await request('login', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ method: 'auto', identifier, password })
  });
  token = session.access_token;
  const { account } = await request('me');
  return account;
}

async function signOut() {
  await request('logout', { method: 'POST' });
  token = null;
}
PHP · профиль (расширение cURL)
<?php
$token = getenv('ARISID_TOKEN');
if (!$token) throw new RuntimeException('Set ARISID_TOKEN');
$curl = curl_init('https://idaris.tech/api.php?action=me');
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer '.$token],
    CURLOPT_TIMEOUT => 15,
]);
$body = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$error = curl_error($curl);
curl_close($curl);
if ($body === false) throw new RuntimeException($error);
$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if ($status !== 200) throw new RuntimeException($data['error'] ?? 'API error');
$account = $data['account'];

CORS и безопасность

Сервер разрешает браузерные запросы с любого origin: Access-Control-Allow-Origin: *. Разрешённые методы: GET, POST, OPTIONS; заголовки: Authorization, Content-Type. Preflight OPTIONS возвращает 204 без тела.

Для fetch используйте credentials: 'omit'. Cookie не нужны; режим запросов с cookie не поддерживается CORS этого API. Ответы API имеют Cache-Control: no-store.

  • В рабочей среде используйте HTTPS. HTTP подходит только для локальной разработки.
  • Храните токен как пароль: не отправляйте в URL, аналитику и логи. В мобильном приложении используйте защищённое хранилище ОС.
  • Не отключайте проверку TLS в серверных клиентах. Не собирайте чужие пароли в недоверенных приложениях.
  • Проверяйте права на сервере вашего приложения. Отображение роли в интерфейсе само по себе не защищает действия.