Мне удалось заставить это работать после некоторых проб и ошибок.
Вот основные шаги, которые я выполняю, когда у меня есть отдельное приложение, которое я разработал, и я хочу, чтобы пользователи могли использовать это приложение для выполнения API-вызовов к сайту Discourse.
Для этого мне нужно генерировать API-токен для каждого пользователя, чтобы выполнять вызовы от имени конкретного пользователя (по крайней мере, в среде Node.js/JavaScript).
Обратите внимание, что для JavaScript-части я нашел код, предоставленный @KengoTODA здесь: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub, очень полезным.
Вот шаги, которые я выполнил:
Первый шаг: Сгенерировать пару публичного и приватного ключей.
Это то, что должно генерировать ваше приложение — публичный и приватный ключи. Гист на GitHub предоставляет один из способов сделать это.
Второй шаг: Настроить URL перенаправления.
Это URL, на который Discourse будет перенаправлять, передавая финальный API-токен в полезной нагрузке (payload). Если у вас десктопное приложение (то есть без URL в браузере), URL перенаправления будет основан на пользовательском протоколе, который вы настроили и который открывает приложение при вводе URL перенаправления в браузере.
Обратите внимание, что URL перенаправления должен быть добавлен в белый список в настройках сайта целевого сайта Discourse.
Также, скорее всего, в настройках сайта Discourse должен быть включен параметр «Разрешить API-ключи пользователей». См. оригинальный пост по этой теме в разделе «Настройки сайта».
Третий шаг: Отправить вызов API-запроса на URL запроса Discourse.
Итак, ваше приложение отправит вызов на URL, который имеет следующий вид:
https://[ваш целевой сайт discourse .com]/user-api-key-new"
и добавляет следующие параметры:
- имя вашего приложения
- ваш “client_id” (мне удалось использовать hostname() из
const {hostname} = require('os') для десктопного приложения, точно так же, как в упомянутом выше гисте на GitHub)
- scopes (это те права доступа, которые вы хотите предоставить пользователю через API, например, “write”, “read” и т. д.)
- ваш публичный ключ (из шага 1 выше)
- ваш URL перенаправления (из шага 2 выше)
- nonce (это значение, которое вы можете выбрать — например, использование ‘1’ кажется работающим)
Четвертый шаг: Пользователь авторизует ваше приложение на странице сайта Discourse, которая открывается по URL запроса.
Когда вы успешно отправляете URL запроса, открывается страница на сайте Discourse, где сообщается пользователю, что ваше приложение хочет получить доступ к сайту.
На этой странице есть кнопка, которую пользователь должен нажать, чтобы разрешить доступ. Когда пользователь нажимает эту кнопку, сайт Discourse перенаправляет на указанный вами URL перенаправления и добавляет параметр ?payload=[API-КЛЮЧ]. Здесь API-КЛЮЧ — это ключ, который вам нужно декодировать в вашем приложении.
Пятый шаг: Ваше приложение перехватывает значение URL перенаправления (с полезной нагрузкой), и вы декодируете API-КЛЮЧ.
Вы почти у цели. Ваше приложение должно проанализировать URL перенаправления, на который перенаправил Discourse, и извлечь API-ключ, содержащийся в полезной нагрузке.
Как только у вас есть этот API-ключ, вам нужно сделать две вещи:
- Получить сам ключ, а не URL-кодированную версию: если вы получаете параметр из URL, он часто бывает URL-кодированным (добавляются % и т. д.). Вам нужно его очистить. В JavaScript я обнаружил, что
decodeURIComponent отлично подходит для этого.
- Как только вы получите очищенный API-КЛЮЧ, возвращенный Discourse, вам нужно его декодировать. Для этого можно использовать декодирование в JavaScript с помощью приватного ключа. По сути, вы используете свой приватный ключ (сгенерированный на первом шаге выше) для декодирования очищенного API-КЛЮЧ. В гисте на GitHub, на который я ссылался выше, есть пример кода на JavaScript: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub
После выполнения кода декодирования у вас будет сам токен, который теперь можно использовать для выполнения аутентифицированных API-вызовов от имени пользователя.
Шестой шаг: Используйте токен (то есть финальный, очищенный, декодированный API-КЛЮЧ) для выполнения API-вызовов от имени пользователя.
С этим токеном, похоже, вам не нужно указывать имя пользователя в API-вызове. Я считаю, что следующего заголовка достаточно при включении его в ваши вызовы GET, POST, PUT и т. д.:
headers: {
"User-Api-Key": [токен]
}
И с этим, надеюсь, у вас есть работающий метод аутентификации для каждого пользователя для взаимодействия с Discourse.