ArisID API
Вход в аккаунт, данные профиля и управление текущей сессией через HTTP.
Документация доступна без авторизации. 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.
Быстрый старт
- Создайте аккаунт в ArisID.
- Отправьте логин и пароль в
action=login. - Сохраните полученный
access_tokenв защищённом хранилище приложения. - Передайте токен в заголовке
Authorizationдля получения профиля.
curl 'https://idaris.tech/api.php?action=login' \
-H 'Content-Type: application/json' \
--data '{"method":"login","identifier":"ivan","password":"YOUR_PASSWORD"}'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. Этот метод регистрирует приложение, но сам по себе не авторизует пользователя.
{"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.
- Получите client_id автоматически, как описано выше. Для ручного управления приложением можно войти в ArisID и открыть Мои приложения. Укажите название и точные адреса возврата, нажмите «Создать приложение» и скопируйте client_id. Подтверждение администратора не требуется. До 20 приложений на аккаунт и до 10 адресов на приложение; HTTPS, а для localhost, 127.0.0.1 и [::1] допустим HTTP. Адреса сравниваются точно, включая порт, путь и параметры. Фрагменты, шаблоны и параметры code/state/error запрещены. client_id публичный; client_secret не нужен, используется PKCE S256. В настройках можно менять адреса и отключать приложение. Отключение отзывает все выданные ему сессии.
- Создайте state из 64 шестнадцатеричных символов и случайный code_verifier длиной 43–128 символов. Сохраните их в серверной сессии. Рассчитайте code_challenge = BASE64URL(SHA256(code_verifier)) без знаков равенства.
- Перенаправьте браузер на
/connect?response_type=code&client_id=…&redirect_uri=…&state=…&code_challenge=…&code_challenge_method=S256. - Проверьте state после возврата. При отмене возвращается error=access_denied. При подтверждении приходит code, действующий 120 секунд и только один раз.
- На сервере отправьте JSON POST на
/connect/token: grant_type=authorization_code, client_id, redirect_uri, code и code_verifier. redirect_uri должен точно совпадать с адресом из первого запроса. - Сохраните 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 шестнадцатеричных символа. Передавайте его точно в полученном виде.
Authorization: Bearer aris_YOUR_ACCESS_TOKENCookie личного кабинета не заменяют 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.
| Поле | Тип | Обязательное | Правила |
|---|---|---|---|
| identifier | string | Да | Логин, почта или телефон. До 254 байт. Пробелы по краям удаляются. |
| password | string | Да | Текущий пароль. API принимает до 128 байт; в аккаунте пароль задаётся длиной 6–32 символа. Регистр и пробелы сохраняются. |
| method | string | Нет | login, email, phone, auto. По умолчанию auto. |
auto ищет по логину или почте. Для телефона укажите phone: 7–15 цифр, допускаются ведущий плюс, пробелы, круглые скобки и дефисы (до 30 символов). Если номер соответствует нескольким аккаунтам, войдите по логину или почте.
{
"method": "phone",
"identifier": "+7 (999) 123-45-67",
"password": "YOUR_PASSWORD"
}{
"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.
{
"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.
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 -X POST 'https://idaris.tech/api.php?action=logout' \
-H "Authorization: Bearer $ARISID_TOKEN"{"ok":true}После выхода удалите токен из приложения. Повторный запрос с этим токеном вернёт 401 invalid_or_expired_token.
Поля аккаунта
| Поле | Тип | Описание |
|---|---|---|
id | string | Публичный ID, например id201. Без ведущих нулей. |
surname | string | null | Фамилия. |
name | string | Имя. |
patronymic | string | null | Отчество. |
phone | string | null | Номер телефона. |
login | string | null | Логин. |
email | string | Адрес электронной почты. |
discord | string | null | Контакт Discord. |
telegram | string | null | Контакт Telegram. |
vk | string | null | Контакт VK. |
role | string | Роль: user или owner. |
created_at | string | Дата создания аккаунта, ISO 8601. |
avatar_url | string | Путь к изображению, доступному по Bearer-токену. |
Незаполненные контакты могут быть пустой строкой или null. В старых аккаунтах отдельные личные поля также могут быть null. API не сообщает, подтверждены ли почта и телефон; их наличие не означает проверку владения.
Сессии на 30 дней
Срок фиксирован: 2 592 000 секунд с момента входа. Неактивность не сокращает его, запросы не продлевают. После окончания выполните вход заново.
Сессии отображаются в личном кабинете как «ArisID API». Пользователь может завершить одну сессию или все остальные. Смена или сброс пароля, блокировка аккаунта и отзыв сессии прекращают API-доступ досрочно.
Сервер хранит только SHA-256 токена. Закрытие приложения не завершает сессию; удаление локального токена не отзывает его на сервере — используйте метод выхода.
Ошибки и лимиты
Ошибки возвращаются в JSON. Проверяйте HTTP-статус до обработки данных.
{"error":"invalid_or_expired_token"}| HTTP | error | Причина / действие |
|---|---|---|
| 400 | invalid_json | Тело не является корректным JSON. |
| 400 | invalid_input | Неверные типы, отсутствующие поля, превышенная длина или неизвестный method. |
| 400 | invalid_phone | Неверный формат телефона. |
| 401 | invalid_credentials | Проверьте данные входа и доступность аккаунта. |
| 401 | unauthorized | Передайте корректный заголовок Authorization. |
| 401 | invalid_or_expired_token | Токен не найден, отозван, истёк или доступ аккаунта изменился. Требуется новый вход. |
| 404 | not_found | Неизвестное действие action. |
| 405 | method_not_allowed | Используйте метод из заголовка Allow. |
| 413 | body_too_large | Тело входа больше 8192 байт. |
| 415 | json_required | Для входа нужен Content-Type: application/json. |
| 429 | rate_limited | Повторите позже. Retry-After: 900 секунд. |
| 500 | server_error | Ошибка сервера. Повторите позже; не повторяйте вход бесконечно. |
Вход ограничен 40 попытками на IP и 15 на идентификатор за 15 минут. Лимиты общие с формой входа сайта; успешные попытки тоже учитываются. Ответ 429 дополнительно содержит текстовое поле message.
Примеры интеграции
В примере JavaScript пароль приходит из формы вашего приложения, а токен остаётся в памяти. Вызовите signIn(identifier, password) из обработчика отправки формы.
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
$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 в серверных клиентах. Не собирайте чужие пароли в недоверенных приложениях.
- Проверяйте права на сервере вашего приложения. Отображение роли в интерфейсе само по себе не защищает действия.