How to get a feed from a password protected Discourse?

Hello. I need to display password protected Discourse feed on the external site. How to do that?

Other sites suggest using this structure http://[username]:[password]@[domain]/[path]
But for Discourse it doesn’t work.

By the way, the external site that I want to show the feed is a wordpress page. Discourse is linked to this page with SSO.

Any ideas?

I assume you mean RSS feeds.

You can generate an API key for a user account on your site in the admin section. Then you can just append it to any URL like so:

http://meta.discourse.org/latest.rss?api_key=KEYHERE

I should note there are security issues with making that api key visible to users. If someone has it, they can do anything that the underlying user account can do. It would be much better to fetch the RSS server side using the key then only exposing the resulting feed.

Also, be especially careful not to generate an “All Users” key for this. If someone gets that key they can do anything as any user on your site. So just be extra careful :smile:

Great answer, eviltrout. Thank you very much :smile:

We are having the issue that the RSS feeds do not work with an api_key if the categories have read restrictions, even if the api_key is valid for a user that should be able to access the category.

Is this a bug or by design?

That sounds like a bug to me. The API key should function as the user associated with it. Are you passing the correct username through too?

No, I’m not passing a username, as I am using a key associated with a user.

If I try in an unauthenticated session:

http://myserver.example.com/latest.json?api_key=my_api_key

I get the results I expect

If I try

http://myserver.example.com/latest.rss?api_key=my_api_key

I get no results.

So unless RSS has some special case of how to use API keys, I think it may be a bug

This was a bug, now fixed via:

With the new fix, I am able to view restricted categories in the RSS feed at …

http://myserver.example.com/c/my_category.rss?api_key=my_api_key

but Latest only shows public topics in the RSS feed

http://myserver.example.com/latest.rss?api_key=my_api_key

Is this still unresolved or am I missing something? Thanks.

Разве теперь ключи API не должны быть в заголовках, @sam?

Да, так и есть! @blake, есть ли у тебя мысли о том, как люди будут использовать приватные RSS-каналы в современных условиях. Поддерживают ли браузеры или RSS-агрегаторы пользовательские заголовки для аутентификации?

Это довольно редкий случай использования, но было бы здорово, если бы у нас был обходной путь.

Единственное, что касается аутентификации в RSS, — это поддержка базовой аутентификации через URL, например https://user:password@www.example.com (которую мы пока не поддерживаем), или что-то вроде того, что мы сейчас поддерживаем через api_key и api_username в URL.

Хотя было бы неплохо полностью отказаться от аутентификации через URL, я считаю, что правильный путь вперёд — чтобы мы по-прежнему могли поддерживать приватные RSS-каналы, — это разрешить этот тип аутентификации только для каналов тем и категорий. Позже мы также можем добавить поддержку ключей API только для чтения.

Проблема также в том, что RSS-ридеры обычно имеют лишь одно поле для ввода URL при добавлении канала. Поэтому даже если бы RSS поддерживал заголовки, в ридерах негде было бы указать учётные данные для заголовка.

Одна идея, связанная с работой @david по определению границ задачи, заключается в том, чтобы создать ключ API пользователя, строго ограниченный одной RSS-лентой. Это минимизирует поверхность атаки, и в таких случаях, когда у нас есть сверхограниченный ключ API пользователя, мы могли бы разрешить его использование без заголовков (добавив столбец в таблицу user_api_key, указывающий, что этот ключ может использоваться для аутентификации через GET).

Проблемы здесь следующие:

  1. У нас нет механизма для генерации пользователями ключей API. Нам пришлось бы создать что-то специально для случая использования RSS, что потребовало бы нового UX. Не уверен, где именно это можно было бы разместить, возможно, в профиле пользователя, но я не знаю точно.

  2. У нас нет механизма для ограничения доступа только к одной конкретной RSS-ленте, который нам пришлось бы реализовать.

  3. У нас нет флага «разрешённый ключ API пользователя» через параметры GET в URL, который был бы необходим для этого.

В целом я считаю, что это задача, которую мы можем решить, но, вероятно, потребуется одна или две недели работы, чтобы всё заработало как надо.

Плюс в том, что часть этой работы полезна независимо от RSS, но минус в том, что некоторые задачи тесно связаны именно с RSS, а количество пользователей этой функции сейчас крайне мало.

Решение, как расставить приоритеты, остаётся за @codinghorror.

У меня WordPress и Discourse интегрированы, и WordPress выполняет SSO. Я генерирую боковую панель с недавними постами в WordPress, используя RSS-ленты из нескольких категорий через API, поэтому мне бы очень хотелось сохранить механизм аутентификации по URL для этой задачи. Иначе мне придётся заняться написанием собственного виджета, чтобы реализовать вариант аутентификации через заголовки. Так что, думаю, я один из тех немногих, кто поддерживает эту функцию (+1).

Может ли кто-нибудь сказать, поддерживается ли это в настоящее время?

У меня не получается заставить это работать.

Если я пытаюсь использовать API_KEY в строке запроса, получаю:

У вас нет прав на просмотр запрошенного ресурса. Имя пользователя или ключ API недействительны.

Это подразумевает, что строка запроса хотя бы обрабатывается.

Обновление:

Ладно, у меня это как-то заработало. Похоже, доступен лишь поднабор RSS-каналов, но не все? Судя по настройкам ключа API, у нас есть доступ к:

Чтение

  • /t/:slug/:topic_id.rss

Чтение списков

  • /c/*category_slug_path_with_id.rss
  • /top/all.rss
  • /top/yearly.rss
  • /top/quarterly.rss
  • /top/monthly.rss
  • /top/weekly.rss
  • /top/daily.rss

Неужели кто-нибудь знает, почему здесь отсутствуют базовые каналы /latest.rss и /top.rss?

Похоже, что при получении RSS с использованием API-ключа необходимо указать заголовок Accept для получения корректных данных.

  • Если вы запрашиваете RSS без указания заголовка Accept, например curl https://bbs.example.com/c/cat.rss?api_key=KEY, это может привести к ответу < HTTP/1.1 404 Not Found.
  • Однако при указании заголовка Accept XML для RSS можно получить корректно. Например:
curl 'https://bbs.example.com/c/cat.rss?api_key=KEY' \
  -H 'application/xhtml+xml' \