Discourse содержит систему для генерации ключей API для каждого пользователя, если соблюдается очень специфичный протокол. Эта функция облегчает доступ «приложений» к экземплярам Discourse без необходимости привлечения модераторов.
Краткое описание
В общих чертах:
-
Клиент (настольное приложение, браузерное расширение, мобильное приложение) генерирует пару закрытого/открытого ключей и URL-адрес возврата.
-
Клиент перенаправляется на маршрут в Discourse, предоставляя ему свой открытый ключ.
-
Discourse получает одобрение пользователя на использование приложения.
-
Discourse генерирует пользовательский ключ API.
-
Discourse перенаправляет обратно на URL-адрес возврата с зашифрованной полезной нагрузкой, используя открытый ключ API, содержащий пользовательский ключ API.
Детали
Сценарии использования:
-
Настольные приложения, которые опрашивают сайты Discourse от имени конечных пользователей, чтобы получить количество уведомлений на нескольких сайтах.
-
Мобильные приложения, которые опрашивают сайты Discourse от имени конечных пользователей и обрабатывают push-уведомления.
-
Веб-приложения, которые предоставляют панель управления для конечных пользователей по различным сайтам Discourse.
-
Пользовательские интеграции с приложениями сторонних разработчиков, которые используют Discourse как часть общего корпоративного приложения. Например: интеграция уведомлений сообщества Discourse в приложение Hopscotch.
Проектирование:
Настройки сайта
-
allow_user_api_key_scopes: разрешенные области доступа для пользовательских ключей API. Области определены здесь. Доступные встроенные области:
read,write,message_bus,push,one_time_password,notifications,session_info,bookmarks_calendar,user_status(плагины могут регистрировать дополнительные области). -
user_api_key_allowed_groups: контролирует, какие группы могут генерировать пользовательские ключи API (по умолчанию: администраторы, модераторы и trust_level_0).
-
allowed_user_api_push_urls: список сайтов, которые могут быть целевыми для push-уведомлений.
-
allowed_user_api_auth_redirects: разрешенные места перенаправления после генерации пользовательского ключа API.
Глобальные настройки
- max_user_api_reqs_per_minute: 50
- max_user_api_reqs_per_day: 4000
Элементы пользовательского интерфейса
Если были выданы какие-либо пользовательские ключи API, Discourse отображает вкладку приложения на странице пользователя.
Вкладка приложения будет содержать:
- Название приложения, например: («Discourse Notifier»)
- Дата последнего использования
- Дата одобрения
- Список предоставленных областей доступа
- Кнопка отозвать доступ, чтобы вы могли легко отозвать любые ключи
Пользовательский интерфейс авторизации ключа API
Каждый ключ должен быть явно авторизован конечными пользователями на странице, которая четко объясняет, что происходит, например:
«Discourse Notifier» запрашивает следующий доступ к вашей учетной записи:
- Чтение и очистка уведомлений
- Чтение информации о сессии пользователя
- Создание одноразового токена входа
[Авторизовать]
Поток генерации ключа API
API требует только одного GET-запроса со стороны пользователя.
https://sitename.com/user-api-key/new
Начиная с версии Discourse 2.1, эти пользовательские ключи API теперь автоматически истекают, если не используются в течение длительного времени. Настройка сайта:
revoke user api keys unused daysпо умолчанию установлена в 180.
Параметры:
- auth_redirect: URL-адрес для перенаправления обратно с сгенерированным токеном.
- application_name: название приложения, выполняющего запрос (будет отображаться на вкладке «Приложения» учетной записи пользователя).
- client_id: уникальный идентификатор клиента.
- nonce: уникальный nonce, сгенерированный клиентом. Он будет возвращен в зашифрованной полезной нагрузке, чтобы клиент мог проверить подлинность ответа.
- scopes: список областей доступа, разрешенных для ключа, разделенный запятыми, см.
allow user api key scopesдля полного списка доступных областей. - push_url: URL-адрес для отправки push-уведомлений (требуется и действителен только если в областях указаны
pushилиnotifications). - public_key: открытая часть пары ключей, сгенерированной клиентом.
- padding (необязательно): режим заполнения RSA для шифрования полезной нагрузки. Принимает значения
pkcs1(по умолчанию) илиoaep. OAEP рекомендуется для новых приложений.
После вызова /user-api-key/new с правильными параметрами может произойти одно из двух событий:
- Если пользователь не вошел в систему, мы перенаправим его на страницу входа (после входа мы возобновим авторизацию).
- После входа пользователя ему будет представлен пользовательский интерфейс авторизации.
После разрешения авторизации система перенаправит обратно на URL-адрес, определенный в auth_redirect, и включит зашифрованный параметр payload, содержащий JSON-объект с сгенерированным пользовательским ключом API (key), nonce, статусом push (push) и версией API (api). Если была запрошена область one_time_password, также будет включен отдельный зашифрованный параметр запроса oneTimePassword. client_id не возвращается для дополнительной безопасности.
Проверка версии API
API ключей пользователей в Discourse имеет версии. Клиенты могут проверить версию API сайта Discourse, отправив HEAD-запрос на https://sitename.com/user-api-key/new. Ответ будет содержать заголовок с именем Auth-Api-Version, содержащий номер версии API сайта.
Использование API
Использование клиентского API будет несколько отличаться от текущего административного API.
Клиент может указать 2 заголовка:
User-Api-Key (обязательно): сгенерированный ключ
и
User-Api-Client-Id (необязательно): укажите это, чтобы обновить ‘client id’, сохраненный для этого ключа API в базе данных.
После указания этих заголовков клиент может выполнять запросы к API, как обычно.
Генерация одноразового пароля для входа
Начиная с версии 4, API включает специальную область: область one_time_password, которая позволяет клиентам использовать пользовательский ключ API для генерации одноразового пароля. Если клиент включает эту область при генерации ключа API, следуя приведенным выше шагам, зашифрованный oneTimePassword будет включен как отдельный параметр запроса при перенаправлении обратно клиенту.
Альтернативно, клиент может отправить GET-запрос на /user-api-key/otp со следующими параметрами:
- auth_redirect
- application_name
- public_key
- padding (необязательно)
и с заголовком User-Api-Key.
Этот запрос перенаправит на экран в Discourse, который попросит пользователя разрешить приложению доступ к сайту. Если пользователь одобрит, сайт перенаправит обратно на URL-адрес, определенный в auth_redirect, и включит зашифрованный параметр oneTimePassword с одноразовым паролем, который клиент может использовать для входа на сайт, запросив https://sitename.com/session/otp/ONE-TIME-PASSWORD. (Одноразовый пароль действителен только в течение 10 минут.)
Отзыв ключей API
Чтобы отозвать ключ API, отправьте POST-запрос с заголовком User-Api-Key и без параметров на /user-api-key/revoke.
Последний обзор выполнен @SaraDev 2022-07-13T00:00:00Z
