К документации
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 в примерах — переменная окружения с токеном из ответа входа. Не подставляйте пароль или токен в публичный исходный код.

Вход на другом сайте · ArisID Connect

Автоматическое подключение

Приложение можно подключить без кабинета разработчика, готового client_id и обращения к администратору. Ваш сервер один раз вызывает POST /connect/register с JSON и сохраняет полученный client_id. Этот метод регистрирует приложение, но сам по себе не авторизует пользователя.

JSON · автоматическая регистрация
{"client_name":"Мой сайт","redirect_uri":"https://example.com/auth/callback","registration_key":"YOUR_RANDOM_64_HEX_KEY"}

registration_key создайте в своём приложении: bin2hex(random_bytes(32)). Сохраните ключ на сервере вместе с настройками установки. Его не нужно получать в ArisID или вводить вручную. Не передавайте его браузеру. Повтор того же ключа и точного адреса возвращает тот же client_id. При смене адреса создаётся отдельная регистрация.

Ответ 201 при создании и 200 при повторе: client_id, client_name, redirect_uri, token_endpoint_auth_method: none, code_challenge_method: S256. Сохраните client_id и redirect_uri в своей базе. Адрес неизменяемый, один на регистрацию. Название не подтверждает владельца домена: при входе пользователь видит фактический адрес возврата.

Разрешены точные HTTPS-адреса; для localhost, 127.0.0.1 и [::1] допускается HTTP. Нельзя использовать wildcard, фрагменты, данные входа в URL и параметры code/state/error. ArisID не обращается к адресу возврата на своём сервере.

Ошибки: 400 invalid_json / invalid_request / invalid_redirect_uri, 403 client_disabled, 405 method_not_allowed, 413 body_too_large, 415 json_required, 429 rate_limited. Лимиты за 15 минут: 120 запросов и 20 новых регистраций на IP; общий предел — 500 новых регистраций. Повтор сохранённой регистрации не расходует лимит новых приложений. При 429 учитывайте Retry-After: 900. Не генерируйте новый ключ при каждом входе.

Вход пользователя

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

  1. Получите client_id автоматически, как описано выше. Для ручного управления приложением можно войти в ArisID и открыть Мои приложения. Укажите название и точные адреса возврата, нажмите «Создать приложение» и скопируйте client_id. Подтверждение администратора не требуется. До 20 приложений на аккаунт и до 10 адресов на приложение; HTTPS, а для localhost, 127.0.0.1 и [::1] допустим HTTP. Адреса сравниваются точно, включая порт, путь и параметры. Фрагменты, шаблоны и параметры code/state/error запрещены. client_id публичный; client_secret не нужен, используется PKCE S256. В настройках можно менять адреса и отключать приложение. Отключение отзывает все выданные ему сессии.
  2. Создайте state из 64 шестнадцатеричных символов и случайный code_verifier длиной 43–128 символов. Сохраните их в серверной сессии. Рассчитайте code_challenge = BASE64URL(SHA256(code_verifier)) без знаков равенства.
  3. Перенаправьте браузер на /connect?response_type=code&client_id=…&redirect_uri=…&state=…&code_challenge=…&code_challenge_method=S256.
  4. Проверьте state после возврата. При отмене возвращается error=access_denied. При подтверждении приходит code, действующий 120 секунд и только один раз.
  5. На сервере отправьте JSON POST на /connect/token: grant_type=authorization_code, client_id, redirect_uri, code и code_verifier. redirect_uri должен точно совпадать с адресом из первого запроса.
  6. Сохраните access_token только на сервере. Запрашивайте профиль через /api.php?action=me; проверяйте права в вашем приложении отдельно.

Запрос подтверждения действует 10 минут. Ошибки обмена: 400 invalid_request / invalid_grant, 405 method_not_allowed, 415 json_required, 429 rate_limited. Ответ успешного обмена содержит access_token, token_type, expires_in и expires_at. Токен действует до 30 дней и отзывается через обычный метод logout.

Авторизация

Используйте заголовок ниже для каждого защищённого запроса. Токен начинается с 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": "id201",
        "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": "id201",
        "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 дней

Срок фиксирован: 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 в серверных клиентах. Не собирайте чужие пароли в недоверенных приложениях.
  • Проверяйте права на сервере вашего приложения. Отображение роли в интерфейсе само по себе не защищает действия.