У меня есть компонент темы, который при загрузке страницы отправляет запрос к внешнему API для получения данных. Однако Bearer-токен, который я использую для получения этих данных, естественно, загружается в скрипте, доступном клиенту. Есть ли способ создать плагин или что-то подобное, чтобы скрыть эту информацию?
Да, вам действительно следует создать плагин и определить метод контроллера, который будет получать данные для вас.
Затем из кода фронтенда вызовите этот метод контроллера, который внедрит токен доступа (bearer token) на стороне сервера, сделав его недоступным для любых третьих сторон, и выполнит запрос к внешнему API.
Вместо создания нового контроллера для этой задачи (что, судя по всему, не рекомендовал Ричард), вы можете довольно легко добавить это в существующий сериализатор, например:
add_to_serializer(:current_user, :my_stuff) do
stuff = get_my_stuff_somehow
stuff
end
Определить, какие сериализаторы доступны и какой из них вам нужен, должно быть достаточно просто (большинство из них легко угадать, но вы можете найти их в app/serializers); поиск по add_to_serializer на GitHub - discourse/all-the-plugins · GitHub должен предоставить множество примеров. Начните с GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub.
Даже если вы не знаете Ruby или Rails, приведенное выше должно дать вам довольно четкое представление о том, что нужно делать. Если нет, вы можете задать вопрос в канале Marketplace, предложив бюджет.
Я считаю, что подключать внешнюю зависимость к сериализатору — очень плохая идея, @pfaffman. Если внешний сервис упадёт или начнёт работать медленно, ваш форум тоже перестанет работать.
Ох, ну, черт. Это действительно звучит правдоподобно. ![]()
@attj, это один из многих случаев, когда я больше доверяю тому, что говорит Ричард, чем тому, что говорю сам.
Боюсь, вам придётся проделать работу по добавлению маршрута и так далее, что потребует ещё довольно много строк кода (вероятно, всего несколько десятков). Я думаю, что Discourse Category Home 🏠 — это один из примеров, где добавляется маршрут.
Кажется, мне удалось написать плагин, но мне нужно загрузить его на GitHub, чтобы включить в мой app.yml. Это, естественно, также раскрывает токен. Есть ли способ обойти это?
Просто прочитайте токен из настройки сайта и введите его туда после установки.
Вполне логично. Спасибо!