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
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.
Да, так и есть! @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).
Проблемы здесь следующие:
У нас нет механизма для генерации пользователями ключей API. Нам пришлось бы создать что-то специально для случая использования RSS, что потребовало бы нового UX. Не уверен, где именно это можно было бы разместить, возможно, в профиле пользователя, но я не знаю точно.
У нас нет механизма для ограничения доступа только к одной конкретной RSS-ленте, который нам пришлось бы реализовать.
У нас нет флага «разрешённый ключ API пользователя» через параметры GET в URL, который был бы необходим для этого.
В целом я считаю, что это задача, которую мы можем решить, но, вероятно, потребуется одна или две недели работы, чтобы всё заработало как надо.
Плюс в том, что часть этой работы полезна независимо от RSS, но минус в том, что некоторые задачи тесно связаны именно с RSS, а количество пользователей этой функции сейчас крайне мало.
Решение, как расставить приоритеты, остаётся за @codinghorror.
У меня WordPress и Discourse интегрированы, и WordPress выполняет SSO. Я генерирую боковую панель с недавними постами в WordPress, используя RSS-ленты из нескольких категорий через API, поэтому мне бы очень хотелось сохранить механизм аутентификации по URL для этой задачи. Иначе мне придётся заняться написанием собственного виджета, чтобы реализовать вариант аутентификации через заголовки. Так что, думаю, я один из тех немногих, кто поддерживает эту функцию (+1).
Похоже, что при получении 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 можно получить корректно. Например: