Use scoped API Keys

API-ключи позволяют нам интегрировать Discourse с другими системами или автоматизировать различные действия. Однако большая сила влечет за собой большую ответственность. Если злоумышленник получит доступ к API-ключу, он сможет получить доступ к конфиденциальным данным или внести изменения на вашем сайте. Чтобы смягчить этот риск и добавить дополнительный уровень безопасности, теперь вы можете ограничивать возможности API-ключа с помощью областей доступа (scopes).

Области доступа (Scopes) и разрешаемые параметры

При создании нового API-ключа вы можете выбрать нужные области доступа. Если навести курсор на иконку :grey_question:, вы увидите краткое описание её назначения. Кнопка :link: покажет вам URL-адреса, связанные с этой областью доступа.

Также вы можете указать, какие параметры принимаются. Для разделения нескольких значений используйте запятые.

Миграция существующих ключей

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

Добавление пользовательских областей доступа

Плагины могут добавлять собственные области доступа, вызывая метод add_api_key_scope:

resource — это символ, используемый для группировки связанных областей доступа, а action — хэш со следующими атрибутами:

  • actions: Список допустимых действий контроллера. Формат: controller_name#method_name.
  • methods: Список разрешенных HTTP-методов (например, %i[get]). Используйте это вместо actions, чтобы сопоставление выполнялось по HTTP-методу, а не по действию контроллера.
  • params: Список имен разрешенных параметров.
  • aliases: Хэш, содержащий альтернативные имена для разрешенных параметров.

Если вы хотите узнать, как определены базовые области доступа, см.:

24 лайка

It seems I get 403 response for getting categories with a read only API key

curl -X GET "https://mysite/categories.json" \
-H "Api-Key: mykey" \
-H "Api-Username: system"

where I have read & read_list permissions on topics for the API key. /top.json works with the same key for instance. The endpoint works when I use a ‘Global Key’

I’d like to put the API key in my client for reading the list of categories and topics, so important to have a read only key!

Any pointers?

1 лайк

Interestingly it works if no credentials are used at all!

k
i.e. curl -X GET "https://mysite/categories.json"

1 лайк

Unfortunately, we only include a handful of scopes out of the box due to the high number of available endpoints. We may add new ones in the future, but in the meantime, you’ll have to extend them to suit your needs.

If you use a scoped API Key, calling endpoints not included by the scopes you choose won’t work. You can click the :link: button to see which URLs are accepted.

This only works for public sites. Also, you won’t see things like private categories unless you are logged in and have enough permissions.

6 лайков

Are you taking suggestions for further scopes?

One thing I’d be interested in using our site’s API for would be for another site to check if a user exists with an email address and add to a group if so. I trust the site (another site within our parent organisation) but tightening down access options to only what’s needed seems wise if it were an option.

1 лайк

I’m super happy that they have opened up an api for plugins. You can start with a plugin and see if it can be incorporated in core.

2 лайка

I believe that pr-welcome for any generally useful scopes you can come up with. E.g. group_membership.edit ?

5 лайков