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

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

Укажите имя приложения и 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';Сгенерируйте ссылку, по которой пользователь будет перенаправлен на 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 — это случайная строка для защиты от атак Cross-Site Request Forgery (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 — это ваш anti-CSRF-токен для валидации запроса.
Извлеките code и 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-запрос на token-эндпоинт с извлечённым кодом авторизации и параметрами, перечисленными ниже.
| Параметр | Значение |
|---|---|
| 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 от имени пользователя.
Передайте токен доступа как 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.'
}
Приложение должно обновить токен доступа.
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. Хранение client secret в клиентском коде. Client secret — это именно секрет. Если он окажется в бинарнике мобильного приложения или в браузерном бандле, любой сможет его извлечь и подделать ваше приложение. Секрет должен жить только на сервере, который вы контролируете. Если приложение чисто клиентское (SPA, мобильное), используйте OAuth 2.0 PKCE-флоу вместо встраивания секрета.
2. Забыли проверить параметр state. Параметр state существует, чтобы предотвращать CSRF-атаки. Если пропустить его проверку в callback, вы оставите дыру, через которую злоумышленный сайт сможет молча привязать аккаунт Quire к сессии приложения атакующего. Генерируйте state для каждого запроса, сохраняйте в сессии и отклоняйте любой callback, в котором возвращённый state не совпадает.
3. Считать токен доступа постоянным. Токены доступа истекают через час. Приложения, которые сохраняют токен и никогда его не обновляют, прекрасно работают в первый день и молча ломаются на второй. Реализуйте цикл обновления токена до релиза, а не как патч «поправим, когда пользователи пожалуются».
4. Поллить API для отслеживания изменений. Поллинг сжигает лимит запросов, увеличивает задержки и расходует батарею. Если нужно реагировать на изменения в Quire — используйте вебхуки. Вебхук отдаёт событие мгновенно, и тот вызов API, который вы бы сделали, чтобы это событие обнаружить, попросту не нужен.
5. Пропустить allowlist для URL-адресов для перенаправления. При регистрации OAuth-приложения принимается список URL-адресов для перенаправления. Если вы заведёте wildcard или вообще пропустите точную настройку, атакующий сможет зарегистрировать свой callback как ваш redirect target и перехватывать коды авторизации. Добавляйте только те URL, которые приложение действительно использует.
Если вы пишете под API впервые, быстрее всего разобраться в шаблонах — форкнуть готовую интеграцию вроде коннектора n8n и посмотреть, как там устроены аутентификация, обновление токена и обработка ошибок.
Три ситуации, в которых стоит выбрать другую поверхность интеграции.
Если ничего из этого не про вас — OAuth API именно ваш инструмент.
Нет. Quire API доступен на всех тарифах, включая бесплатный. Лимиты по частоте запросов действуют на всех тарифах — актуальные ограничения на приложение смотрите в документации API.
API работает по HTTP с телами запросов и ответов в JSON, поэтому подходит любой язык с HTTP-клиентом и парсером JSON. Примеры в этой статье на JavaScript, но тот же поток без изменений работает на Python, Go, Ruby, PHP и любом другом языке. Официальной клиентской библиотеки нет: поверхность API достаточно мала, чтобы тонкая обёртка над HTTP-клиентом вашего языка стала привычным паттерном.
По умолчанию токены доступа действуют один час. Refresh-токены живут дольше и позволяют получать новые токены доступа без повторного запроса разрешения у пользователя. Закладывайте цикл обновления токена в приложение с первого дня.
Да. Области (scopes) OAuth позволяют запрашивать только те разрешения, которые действительно нужны приложению. Если приложение только читает задачи — запрашивайте scopes на чтение. Пользователи Quire увидят запрашиваемые области на странице авторизации и могут отказать, если запрос покажется избыточным, поэтому «запрос с запасом» бьёт по конверсии.
API — это универсальная REST-поверхность для любого приложения, которое хочет читать или изменять данные Quire от имени пользователя. MCP-сервер создан специально для Claude и других LLM-агентов: он берёт аутентификацию на себя, отдаёт стандартную схему инструментов и избавляет вас от написания OAuth-кода. API используйте для классических интеграций приложений, MCP — для интеграций с LLM-агентами.
Это и есть полный OAuth 2.0-поток для Quire API: настройка OAuth-приложения, четырёхшаговая авторизация, использование токена доступа и цикл обновления. Самая частая причина, по которой разработчики выкатывают рабочую интеграцию, которая ломается через два дня, — отношение к циклу обновления как к «поправим потом» вместо того, чтобы заложить его с первого дня.
Начните с консоли разработчика Quire или почитайте полный справочник API. Если писать OAuth-код вообще не хочется, MCP-сервер Quire возьмёт аутентификацию на себя и будет правильным выбором для интеграций с LLM-агентами. Для событийных интеграций вебхуки почти всегда подходят лучше, чем паттерн поллинга, к которому в итоге приходит большинство первых интеграций с API.