
Последнее обновление: 28 мая 2026 г.
Кратко: Quire OAuth 2.0 API позволяет приложению действовать от имени пользователя в его аккаунте Quire, не сохраняя пароль. Вам понадобится зарегистрированное OAuth-приложение (ID клиента, секрет, URL-адрес для перенаправления), четыре шага авторизации (настройка, перенаправление, обработка ответа, обмен кода на токен) и цикл обновления токенов — поскольку токены доступа истекают через один час.
Разработка приложения, которое читает или изменяет данные Quire пользователя, начинается с одного решения: как аутентифицировать пользователя, не видя его пароля? Quire API решает эту задачу с помощью OAuth 2.0. В этой статье разберём настройку OAuth-приложения, четыре шага авторизации, цикл работы с токенами доступа и типичные ошибки разработчиков при первой реализации.
Версия 1.0.0 OpenAPI Quire вышла в октябре 2019 года и с тех пор остаётся стабильной. С OAuth пользователи разрешают приложению доступ к своему контенту в Quire (задачи, проекты, комментарии, назначения, метки, даты выполнения), и вы никогда не касаетесь их учётных данных. Пользователь может отозвать доступ в любое время, не меняя пароль — именно поэтому интеграции с хранением паролей считались антипаттерном безопасности ещё до того, как OAuth сделал их ненужными.
Прежде чем подключать OAuth API, убедитесь, что он действительно нужен. В 2026 году Quire поддерживает четыре способа интеграции, каждый из которых решает свою задачу.
| Если вам нужно... | Используйте | Почему |
|---|---|---|
| Читать или изменять данные Quire от имени пользователя в своём приложении | Quire OAuth API (эта статья) | Авторизация пользователя, полный CRUD-доступ, опрос не нужен |
| Реагировать на события в Quire (создана задача, изменился статус, добавлен комментарий) | Вебхуки Quire | Push-механизм без накладных расходов на опрос, простая настройка |
| Подключить Quire к Claude или другому AI-агенту | Сервер Quire MCP | Стандартный протокол для LLM-инструментов, поставляется с готовым сервером |
| Интегрировать Quire в автоматизацию или BI-процесс | OAuth API и n8n или Power BI | Готовые пайплайны, минимум кастомного кода |
Если вы создаёте стандартную интеграцию (мобильное приложение, веб-дашборд, сервис синхронизации), OAuth API — то, что нужно. Дальнейший текст предполагает именно этот сценарий.
Чтобы использовать Quire API, необходимо создать OAuth-приложение.
Для создания приложения нужно быть авторизованным в аккаунте Quire.
Перейдите в консоль разработчика Quire и нажмите кнопку Создать новое приложение.

Выберите Организацию в Quire, к которой будет относиться приложение: участники организации смогут просматривать и редактировать все Приложения, принадлежащие выбранной организации.

Задайте название приложения и URL-адрес для перенаправления — о его роли мы поговорим позже. Пока укажите следующий URL-адрес для перенаправления:
http://localhost:3000/callback
Нажмите кнопку Создать новое приложение — созданное OAuth-приложение появится в консоли разработчика, где его можно дополнительно настроить.

В итоге у вас должны быть три ключевых параметра:
http://localhost:3000/callback
Сохраните конфигурационные данные приложения в его коде.
const clientId = ':wJoMEodI4fSSR54pfNwIuIzLnaJ';
const clientSecret = 'eb8faf4nyd1wbeconw060e9ejui8zg6w8p1hyoex';
const redirectURI = 'http://localhost:3000/callback';
const authorizationUrl = 'https://quire.io/oauth';
const tokenUrl = 'https://quire.io/oauth/token';
const apiUrl = 'https://quire.io/api';Сформируйте URL авторизации, на который будете перенаправлять пользователей к OAuth-эндпоинту Quire. Там авторизованные пользователи Quire смогут разрешить приложению доступ к своему контенту.
Пример URL:
https://quire.io/oauth?client_id=your-client-ID&redirect_uri=your-redirect-uriПример ссылки для авторизации может выглядеть так:
var http = require('http');
var url = require('url');
var server = http.createServer(function (req, res) {
var uri = url.parse(req.url, true);
if (uri.pathname == '/') {
//..
} else if (uri.pathname == "/install") {
var authUrl = authorizationUrl
+ '?client_id=' + clientId
+ '&redirect_uri=' + encodeURIComponent(redirectURI);
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write(
'<html><body>'
+ '<a href="' + authUrl + '">Connect Quire</a>'
+ '</body></html>');
res.end();
} else if (uri.pathname == "/callback") {
//...
}
});
server.listen(3000);Параметр state — это случайная строка для защиты от атак межсайтовой подделки запросов (CSRF). Сгенерируйте произвольную строку символов: она будет возвращена приложению без изменений на шаге 3, и приложение должно проверить её. Параметр необязателен, но мы настоятельно рекомендуем его использовать.
Пример URL:
https://quire.io/oauth?client_id=your-client-ID&redirect_uri=your-redirect-uri&state=lpcl9v94zOAuth 2.0 сервер отвечает на запрос доступа вашего приложения, используя URL, указанный в redirect_uri.
Если пользователь утверждает запрос доступа, ответ содержит код авторизации. Если пользователь не утверждает запрос — ответ содержит сообщение об ошибке. Код авторизации или сообщение об ошибке возвращаются в строке запроса, как показано ниже:
Ответ с ошибкой:
http://localhost:3000/callback?error=access_deniedОтвет с кодом авторизации:
http://localhost:3000/callback?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7Пример обработки callback:
//...
} else if (uri.pathname == "/callback") {
var result = uri.query;
var message = 'Auth fail';
if (result["error_description"] != null) {
message = result["error_description"];
if (result["error"] == 'access_denied') {
//display reject message
}
messageView(res, message);
} else if (result["code"] != null) {
return exchangeAccessToken(result["code"])
.then(function(data) {
var token = data['access_token'];
message = token != null ? 'Success': 'Fail';
messageView(res, message);
});
}
}Когда пользователь перенаправляется обратно на redirect_uri вашего приложения, в параметрах строки запроса также присутствуют code и state. Параметр state — это антифоргери-токен CSRF для проверки запроса.
Извлеките код и state из параметров строки запроса. На этом этапе можно проверить state.
Пример валидации:
} else if (result["code"] != null) {
if (result["state"] != stateFromSession(res))
return messageView(res, 'invalid state');
return exchangeAccessToken(result["code"])
.then(function(data) {
var token = data['access_token'];
message = token != null ? 'Success': 'Fail';
messageView(res, message);
});
}Приложение должно выполнить POST-запрос к эндпоинту токенов, передав полученный код авторизации и указанные ниже параметры.
| Параметр | Значение |
|---|---|
| grant_type | authorization_code |
| code | {your-authorization-code} |
| client_id | {your-client-ID} |
| client_secret | {your-client-secret} |
| redirect_uri | Обязателен, если вы указывали redirect_uri на шаге 2. Значение должно совпадать с использованным там. |
Пример запроса токена доступа:
var request = require('request');
function exchangeAccessToken(code) {
return new Promise(function(resolve, reject){
request.post({
url: tokenUrl,
form: {
grant_type: 'authorization_code',
code: code,
client_id: clientId,
client_secret: clientSecret,
redirect_uri: redirectURI
}
},
function (error, httpResponse, body) {
if (error) {
return reject(error);
}
resolve(JSON.parse(body))
});
});
}Полученный токен доступа будет в формате JSON.
Пример ответа:
{
"access_token":"ACCESS_TOKEN",
"token_type": "bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN"
}Храните токен надёжно и постоянно — он необходим для обращения к любому Quire API.
Теперь у приложения есть токен доступа для выполнения API-вызовов от имени пользователя.
Выполните API-запрос, передав токен доступа в заголовке запроса как bearer-токен.
Пример API-вызова:
function getCurrentUser(token) {
return new Promise(function(resolve, reject){
request.get({
url: apiUrl + '/user/id/me',
headers: {
"Authorization": "Bearer " + token
}
},
function (error, httpResponse, body) {
if (error) {
return reject(error);
}
resolve(JSON.parse(body))
});
});
}Пример ответа:
{
"email": "john@gmail.cc",
"website": "https://coolwebsites.com",
"id": "My_ID",
"description": "This is *cool*!",
"url": "https://quire.io/u/My_ID",
"nameText": "My Name",
"nameHtml": "My Name",
"descriptionText": "This is cool!",
"descriptionHtml": "This is <i>cool</i>!",
"image": "https://quire.s3.amazonaws.com/oid/image.jpg",
"iconColor": "37",
"name": "My Name",
"oid": "Dyh2YkFcu9uLgLFIeN1kB4Ld"
}Токен доступа намеренно рассчитан на краткосрочное использование — это важный механизм безопасности OAuth 2.0. При использовании Authorization Code Grant Flow токены доступа по умолчанию действуют один час.
По истечении токена доступа возвращается ошибка HTTP 401:
{
code: 401,
message: 'Invalid or expired token.'
}
Your application will need to refresh the access token.
function refreshToken(refreshToken) {
return new Promise(function(resolve, reject){
request.post({
url: tokenUrl,
form: {
grant_type: 'refresh_token',
refresh_token: refreshToken,
client_id: clientId,
client_secret: clientSecret
}
},
function (error, httpResponse, body) {
if (error) {
return reject(error);
}
resolve(JSON.parse(body))
});
});
}Как вариант, приложение может перенаправить пользователя обратно в процесс аутентификации.
Наблюдая за командами, которые разрабатывают интеграции с Quire API, мы выявили пять одинаковых проблем. Ни одна из них не является тонкой — все они предотвратимы.
1. Хранение секрета клиента в клиентском коде. Секрет клиента — это именно секрет. Если он окажется в бинарнике мобильного приложения или в браузерном бандле, любой сможет его извлечь и подделать ваше приложение. Секрет должен находиться только на сервере под вашим контролем. Если приложение полностью клиентское (SPA, мобильное), используйте OAuth 2.0 PKCE flow вместо встраивания секрета.
2. Пропуск валидации параметра state. Параметр state существует для защиты от CSRF-атак. Если не проверять его в callback, остаётся уязвимость, которую вредоносный сайт может использовать для незаметной привязки аккаунта Quire к сессии злоумышленника. Генерируйте state для каждого запроса, храните в сессии и отклоняйте любой callback, где возвращённый state не совпадает.
3. Отношение к токену доступа как к постоянному. Токены доступа истекают через один час. Приложения, которые сохраняют токен и никогда его не обновляют, прекрасно работают в первый день и тихо ломаются на второй. Реализуйте цикл обновления токенов до запуска, а не как «патч по жалобам пользователей».
4. Опрос API для отслеживания изменений. Опрос расходует лимит запросов, увеличивает задержки и разряжает аккумулятор. Если нужно реагировать на изменения в Quire, используйте вебхуки. Вебхук мгновенно доставит событие к вам — и API-вызов для обнаружения этого события вообще не понадобится.
5. Пропуск списка разрешённых URL-адресов для перенаправления. Каждое OAuth-приложение при регистрации принимает список URL-адресов для перенаправления. Если использовать шаблоны или не настроить его точно, злоумышленник может зарегистрировать свой callback как цель перенаправления и перехватить коды авторизации. Указывайте только те URL-адреса для перенаправления, которые реально используются приложением.
Если вы впервые разрабатываете интеграцию с API, самый быстрый способ освоить паттерны — скопировать готовую интеграцию, например коннектор n8n, и изучить, как в ней реализованы аутентификация, обновление токенов и обработка ошибок.
Три сценария, когда стоит выбрать другой способ интеграции.
Если ни один из этих случаев не подходит — OAuth API к вашим услугам.
Нет. Quire API доступен на всех тарифах, включая бесплатный. Ограничения по частоте запросов действуют на всех тарифах; актуальные лимиты для каждого приложения указаны в документации API.
API построен на HTTP с телами запросов и ответов в формате JSON, поэтому подойдёт любой язык с HTTP-клиентом и парсером JSON. Примеры в этой статье написаны на JavaScript, но такой же подход идентично работает на Python, Go, Ruby, PHP и любом другом языке. Официальной клиентской библиотеки нет — поверхность API достаточно мала, и распространённый паттерн — тонкая обёртка над HTTP-клиентом вашего языка.
По умолчанию токены доступа истекают через один час. Токены обновления действуют дольше и позволяют получать новые токены доступа без повторного запроса у пользователя. Реализуйте цикл обновления токенов с самого начала разработки.
Да. Области действия OAuth позволяют запрашивать только те разрешения, которые нужны приложению. Если приложение только читает задачи, запросите области для чтения. Пользователи Quire увидят запрошенные разрешения на странице авторизации и могут отказать, если запрос кажется избыточным — чрезмерные запросы снижают конверсию.
API — это универсальный REST-интерфейс для любого приложения, которому нужно читать или изменять данные Quire от имени пользователя. MCP-сервер создан специально для Claude и других LLM-агентов: он берёт на себя аутентификацию, предоставляет стандартную схему инструментов и избавляет от необходимости писать OAuth-код. Используйте API для традиционных интеграций приложений, а MCP — для интеграций с LLM-агентами.
Вот полный цикл OAuth 2.0 для Quire API: настройка OAuth-приложения, четыре шага авторизации, использование токена доступа и цикл его обновления. Главная причина, по которой разработчики выпускают работающую интеграцию, которая ломается через два дня, — откладывание реализации цикла обновления «на потом» вместо того, чтобы заложить его с самого начала.
Начните работу в консоли разработчика Quire или изучите полный справочник API. Если вы предпочитаете не писать OAuth-код самостоятельно, сервер Quire MCP возьмёт аутентификацию на себя и станет правильным выбором для интеграций с LLM-агентами. Для интеграций, управляемых событиями, вебхуки обычно подходят лучше, чем паттерн опроса, к которому большинство разработчиков приходит при первом знакомстве с API.