Получение токена
Бот получает токен сотрудника по стандартной схеме OAuth 2.0 с кодом авторизации (RFC 6749) и PKCE (RFC 7636). Перед началом включите авторизацию на вкладке OAuth в карточке бота — подробнее в разделе Настройка авторизации. Кроме неё, боту нужны исходящий вебхук и токен, иначе сотрудник не получит кнопку. Всё, что должно быть включено, собрано в Чек-листе запуска.
| Адрес | Назначение |
|---|---|
https://app.pachca.com/apps/authorize | Экран согласия, на него ведёт кнопка |
https://api.pachca.com/api/shared/v1/oauth/token | Обмен кода на токен |
https://api.pachca.com/api/shared/v1/oauth/revoke | Отзыв токена |
Те же адреса публикуются в метаданных сервера авторизации по RFC 8414: https://api.pachca.com/.well-known/oauth-authorization-server.
Шаги
Сгенерируйте state и пару PKCE
На каждую кнопку создайте случайный state и проверочный код code_verifier — случайную строку длиной от 43 до 128 символов. Из него получите code_challenge: SHA-256 от code_verifier в кодировке base64url без = на конце.
Сохраните state, code_verifier и идентификатор сотрудника, которому отправляете кнопку: по state вы узнаете, чей это возврат. Для варианта Браузер, мобильное, CLI PKCE обязателен, для варианта Серверное, с секретом — рекомендуется.
Соберите ссылку авторизации
client_id— с вкладки OAuth в карточке ботаredirect_uri— один из адресов возврата бота, совпадение проверяется точноresponse_type— всегдаcodestate— значение из первого шагаcode_challengeиcode_challenge_method— PKCE, метод толькоS256
Параметр scope передавать не нужно: набор прав сервер берёт из настроек бота.
Отправьте кнопку
Отправьте ссылку сотруднику URL-кнопкой в личной переписке с ботом — методом POSTНовое сообщение с entity_type: "user". Подробнее о кнопках — в разделе Кнопки в сообщениях.
Кнопка авторизации в сообщении бота
В тексте рядом с кнопкой объясните, зачем боту доступ и что он будет делать, и попросите не пересылать ссылку.
Примите возврат
Сотрудник видит экран согласия и нажимает Разрешить. Браузер возвращается на ваш адрес с параметрами code, state и iss — последний всегда равен https://api.pachca.com и подтверждает, что код выдала Пачка.
Найдите сохранённый state и сразу удалите его: каждый state действует один раз. Если сотрудник нажал Отменить, возврата на ваш адрес не будет — браузер просто вернётся назад. Поэтому храните неиспользованные state ограниченное время, например сутки.
Обменяйте код на токен
Код живёт 10 минут и обменивается один раз. Серверное приложение передаёт client_secret в теле запроса или в заголовке Authorization: Basic, приложение без секрета — только code_verifier.
Поля expires_in в ответе нет: токен бессрочный и работает, пока сотрудник не отзовёт доступ. Обновлять его не нужно.
Проверьте, чей это токен
Запросите GETИнформацию о токене с новым токеном: в data.user_id придёт сотрудник, который дал согласие. Отдельных прав метод не требует. Сравните его с сотрудником, которому вы отправляли кнопку.
Сообщение с кнопкой могли переслать, и тогда согласие дал другой сотрудник. Сохраните токен за ним, а тому, кому отправляли кнопку, пришлите её снова. Отзывать такой токен не стоит: если этот сотрудник уже авторизовал бота раньше, Пачка вернула его прежний токен, и отзыв отключит его доступ.
Храните токен на сотрудника
Сохраните токен в привязке к сотруднику и передавайте в заголовке Authorization: Bearer при запросах от его имени. Токен даёт доступ ко всему, что видит сотрудник, в пределах выданных прав: храните его как пароль.
Пример на TypeScript
Серверное приложение на Express: кнопка в ответ на сообщение сотрудника и обработчик возврата.
Ошибки и отказы
Если сотрудник не получает кнопку или бот молчит, дело обычно не в OAuth, а в настройках вокруг него — пройдите Чек-лист запуска.
При обмене кода
invalid_grant— код истёк, уже использован или выдан для другогоredirect_uri, либоcode_verifierне подходит кcode_challenge. Отправьте сотруднику новую кнопку.invalid_client— неверныйclient_idилиclient_secret. Проверьте секрет: после обновления старое значение перестаёт работать сразу.429 Too Many Requests— слишком много обменов подряд. У обмена кода свой лимит, повторите запрос через время из заголовкаRetry-After.
При работе с токеном сотрудника
401 Unauthorized— сотрудник отозвал доступ, у бота отключили авторизацию или бот удалён. Удалите токен и, когда сотрудник снова обратится к боту, пришлите кнопку заново.403 Forbiddenсinsufficient_scope— права нет в выданном наборе. Если в настройки бота его уже добавили, пришлите кнопку заново: сотрудник подтвердит новый набор.403 Forbiddenсrole_forbidden— право в наборе есть, но роль сотрудника его не позволяет. Повторная авторизация не поможет: напишите сотруднику, что действие недоступно его роли. Подробнее о формате отказа — в разделе Ошибки авторизации.
Отзыв токена ботом
Бот может сам отозвать токен сотрудника, например когда тот отключает интеграцию в вашем сервисе. Серверное приложение отправляет на адрес отзыва token вместе с client_id и client_secret, приложение без секрета — сам токен в теле запроса и в заголовке Authorization: Bearer. Как сотрудник отзывает доступ сам — в разделе Согласие и отзыв.