Тысячи запросов к пользовательскому API и инвалидация

Я только что заметил, что в отчетах по безопасности на панели управления с апреля этого года отображаются тысячи запросов к пользовательскому API в день.

Это очень странно и превышает мои ожидания в 100–1000 раз.

Как получить более подробные отчеты о том, какие ключи запрашивают пользователи, кто и сколько запросов делает, а также какие именно вызовы API используются? Если у ключа есть права на чтение/запись, я предполагаю, что кто-то может удалённо читать и записывать темы/сообщения. Не исключено ли, что это парсинг постов с удалённого сайта?

Также есть ли способ глобально аннулировать/истечь все пользовательские API-ключи?

Просто для уточнения: вы спрашиваете о запросах к пользовательскому API, а не о запросах, выполненных с использованием API-ключа, который вы сгенерировали для пользователей на странице «Администрирование / API» вашего сайта Discourse. Запросы к пользовательскому API выделены зеленым цветом на скриншоте ниже:

Подробности о том, для чего используются пользовательские API-ключи, можно найти здесь: User API keys specification.

Если вы не создавали приложение, интегрированное с вашим сайтом Discourse, наиболее вероятные объяснения — либо пользователи входят на сайт через приложение DiscourseHub (https://play.google.com/store/apps/details?id=com.discourse&hl=en&gl=US&pli=1), либо они используют приложение, аналогичное Fig - Native Discourse client for iOS, для взаимодействия с сайтом.

Это не отвечает на все ваши вопросы, но вы можете получить общее представление о том, как используются пользовательские API-ключи, с помощью следующего запроса Data Explorer:

SELECT * FROM user_api_keys

Чтобы получить список приложений, которые делают запросы к пользовательским API-ключам на ваш сайт, и количество пользователей, использующих каждое приложение:

SELECT
application_name,
COUNT(application_name) AS user_count
FROM user_api_keys
GROUP BY application_name

Пользовательские API-ключи, используемые для подключения через приложение DiscourseHub, будут иметь поле application_name со значением «Discourse - unknown».

Если пользователь использует пользовательский API-ключ для взаимодействия с сайтом, в разделе «Безопасность» на странице его настроек появится запись о приложении:

Запись показывает права доступа (scopes), предоставленные приложению. Также вы можете отозвать доступ к приложению.

Я не вижу способа истечь или отозвать все пользовательские API-ключи через интерфейс Discourse. Есть только возможность отзывать ключи по одному на страницах настроек пользователей. Технически можно отозвать все пользовательские API-ключи через консоль Rails, но, вероятно, стоит сначала изучить, как эти ключи используются.

Спасибо, да, это запросы к User API

Похоже, что запросов от приложения DiscourseHub слишком много. Если на вашем сайте установлен модуль Data Explorer, мне было бы интересно увидеть результаты следующего запроса:

SELECT
application_name,
COUNT(application_name) AS user_count
FROM user_api_keys
GROUP BY application_name

Я протестировал этот запрос на своём тестовом сайте, но там есть только один user_api_request от приложения DiscourseHub. Мне кажется, что запрос составлен правильно для обработки подключений нескольких пользователей к Discourse из разных приложений, но дайте знать, если что-то в результатах покажется странным.

Понадобилось время, чтобы установить Data Explorer, по какой-то причине моя сборка не удалась.

Вот что я вижу:

application_name user_count
Discourse - xhanse's iPhone X 1
Discourse - iPhone 1
Discourse - xrett's iPhone 2
Discourse - xave's iPhone 1
Discourse - xixu's iPhone 1
Discourse - xevin's GS8 1

Я скрыл некоторые имена, похоже, это всего несколько пользователей. Возвращает ли запрос информацию за определённый период? Тысячи API-запросов для нескольких пользователей кажутся мне чрезмерными. Также у одного пользователя, кажется, два значения user_count. Это значит, что у него два ключа API (то есть два приложения)?

В этом случае возможны два варианта. Либо у пользователя два iPhone с одинаковым именем устройства, либо он в какой-то момент удалил приложение и установил его заново. В обоих случаях у него будет несколько API-ключей.

Нет, он возвращает сведения обо всех активных ключах API пользователей.

Попробуйте выполнить следующий запрос:

SELECT * FROM user_api_keys

Предполагаю, что он вернёт только 7 строк. Дайте знать, если это не так.

Не обязательно. Когда пользователи получают доступ к сайту через приложение DiscourseHub, их запросы к сайту учитываются как запросы к API пользователей. Если несколько пользователей активно просматривают сайт, они могут сгенерировать 2 тысячи запросов за день.

Да, всё верно, я вижу только 7 элементов.

Означает ли это, что всё в порядке? Я не знаю контекста здесь, является ли это нормальной нагрузкой для форума?

Мне всё это кажется разумным. Для контекста: сегодня я кратко зашёл на свой тестовый сайт через приложение DiscourseHub. На сайте практически нет контента. Я несколько минут просматривал его и сгенерировал 36 запросов к API пользователей. На сайте с большим объёмом контента, который нужно прокручивать, не будет удивительным, если один пользователь за день создаст множество запросов.

Если вы всё ещё обеспокоены этим, можно использовать плагин Data Explorer, чтобы изучить активность пользователей, чьи user_id были возвращены в этом запросе:

SELECT * FROM user_api_keys

Любопытство взяло верх, и я проверил сайт, который я почти исключительно использую через приложение DiscourseHub. За последние 24 часа с этого сайта было сделано чуть меньше 1100 запросов к API ключу пользователя, и я единственный пользователь с активным ключом. :slight_smile: