Возможно, мы строим одно и то же
, хотя мой вариант лишь отчасти headless.
Подозреваю, что нет, и это сделано намеренно.
Я тоже об этом задумывался, но в моём случае, думаю, это не станет проблемой — я не пытаюсь скрыть Discourse.
Одно важное замечание: лимиты скорости (rate limits) по умолчанию различаются для пользовательских API-ключей и административных ключей «для всех пользователей»:
Available settings for global rate limits and throttling.
Лимиты для пользовательского API:
DISCOURSE_MAX_USER_API_REQS_PER_MINUTE: по умолчанию 20
DISCOURSE_MAX_USER_API_REQS_PER_DAY: по умолчанию 2880
Лимиты для административного API:
DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE: 60
Если ваше приложение подключается к самостоятельно размещённому экземпляру Discourse, вы, скорее всего, сможете переопределить лимиты для административного API. Если же подключение идёт к хостинговым экземплярам Discourse, лимиты для пользовательского API предлагают гораздо больше гибкости. При использовании лимитов административного API вам в итоге придётся помещать все запросы в очередь с ограничением скорости.
Редактирование: вместо использования спецификации пользовательских API-ключей для генерации ключей можно использовать административный API-ключ для создания пользовательских API-ключей. Это решает проблему необходимости одобрения приложения пользователем.
Обратите внимание: приведённый ниже ключ относится к моему локальному домену (localhost), поэтому его публикация не представляет риска.
Неэкранированные параметры ключа: {key:description:sally} {key:username:sally} {key:scopes:[scope_id:topics:write]} {key:scopes:[key:write]} {key:scopes:[name:write]} {key:scopes:[params:[topic_id]]} {key:scopes:[urls:[/posts (POST)]]} {key:scopes:[selected:true]}
❯ curl -X POST "http://localhost:4200/admin/api/keys" \
-H "Api-Key: $api_key" \
-H "Api-Username: system" \
-H "Content-Type: application/json" \
-d $json
{"key":{"id":29,"key":"f5c6307b51dd2882bde525dc9775fe7504b55c93fa40177b650f9e6b77a9d25b","truncated_key":"f5c6","description":"sally","last_used_at":null,"created_at":"2024-06-02T00:44:19.944Z","updated_at":"2024-06-02T00:44:19.944Z","revoked_at":null,"user":{"id":3,"username":"sally","avatar_template":"/user_avatar/127.0.0.1/sally/{size}/58_2.png"},"api_key_scopes":[{"resource":"topics","action":"write","parameters":["topic_id"],"urls":["/posts (POST)"],"allowed_parameters":{},"key":"write"}]}}
В любом случае у вас остаётся API-ключ, который каким-то образом нужно управлять. Я предполагаю, что он должен быть зашифрован и сохранён в базе данных.