Может ли пользователь без прав администратора сгенерировать свой собственный API-ключ?

Привет :waving_hand:,

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

  • Предназначен ли API-ключ и для обычных пользователей?
  • Если да, как обычные пользователи могут создать свой API-ключ?
  • Если да, есть ли какие-то необходимые настройки для включения API-ключей для обычных пользователей?
    • На странице настроек форума нет интерфейса для создания API-ключа. Поэтому я предполагаю, что существуют какие-то настройки, позволяющие пользователям выдавать свои API-ключи.

Заранее спасибо! :folded_hands:

Привет @KengoTODA, добро пожаловать! :slight_smile: :wave:

User API keys specification будет полезен для того, что вы описали.

Спасибо! Я ознакомился с разделом «Процесс генерации ключа API».

Я понял, что он предназначен для веб-приложений, которые могут предоставить URL auth_redirect.
Есть ли какие-либо рекомендуемые способы для CLI или GitHub Actions?

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

Для программ CLI, если это необходимо, вы можете запустить локальный веб-сервер и использовать URL вида http://localhost:XXXXX/callback. Приложение делает что-то подобное.

Хорошо, я попробую, спасибо за поддержку!

Вы можете создать пользовательский API, следуя инструкции по адресу Generate User API Keys for testing

Я работаю в этой ветке и успешно запускаю команду, используя localhost в качестве URL-адреса перенаправления. Однако после нажатия кнопки авторизации на странице https://meta.discourse.org/user-api-key возникает ошибка JS, и операция не может быть завершена. Ruby-скрипт работает, но он также терпит неудачу при добавлении параметра auth_redirect.

Вот исключение, сообщенное в консоли браузера:

Uncaught TypeError: Cannot set property 'isReadOnly' of undefined
    at Function.createCurrent (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:44867)
    at Function.current (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:8816)
    at Object.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:70403)
    at Object.i.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:7001)
    at _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49660
    at i.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67904)
    at i.walk (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67891)
    at n.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67858)
    at n.topsort (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67758)
    at t._runInitializer (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49667)

Я приложу скриншот анализа кода JS. Похоже, что siteAttributes должен содержать корректное значение, но он равен undefined. Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать. Спасибо!

Я расследую эту проблему.

JS выбрасывает ошибку, потому что POST-запрос к /user-api-key возвращает 403, а метод build_not_found_page в контроллере не вызывает метод preload_anonymous_data, который сохраняет предварительно загруженные данные.

Неясно, почему сервер ответил кодом 403 с <h1 class="title">Ой! Эта страница приватна.</h1>, когда я добавил параметр auth_redirect. Я попробовал использовать тот же домен для callback-URL (чтобы проверить проблему межсайтового скриптинга) и протокол HTTPS, но безрезультатно.

Вам нужно добавить домен (и путь) в настройку сайта «Разрешенные перенаправления аутентификации API пользователя».

Если вы вручную отправляете HTTP-запросы, то discourse://auth_redirect должен работать.

Спасибо, я нашел конфиг в site_settings.yml и понял, почему мой запрос возвращал ошибку 403.

discourse://auth_redirect работает не так, как я ожидал, поэтому я предложу пользователям вручную вводить зашифрованный токен, как в примере кода на Ruby.

Примечание для других пользователей: я создал модуль Node.js, который можно запускать через команду npx. Он создаёт API-ключ с областью доступа write. Надеюсь, это поможет упростить процесс настройки систем, которым требуется токен Discourse API.

Редакция: Привет @KengoTODA. Ваш код на GitHub помог мне найти правильное направление. Я ещё прорабатываю несколько моментов, а затем напишу, как мне удалось всё настроить.

Код из репозитория GitHub пользователя @KengoTODA очень помог мне. Теперь у меня есть рабочая версия аутентификации пользователей индивидуально для выполнения API-вызовов к Discourse. Я описал свои шаги здесь: User API keys specification - #45 by JQ331