Как использовать API-ключ в AJAX-запросе?

Я пытаюсь программно получить информацию о группе через API Discourse. У меня есть код для этого в панели кастомизации, внутри тега < /head>. Я являюсь администратором своего форума.

Это не работает, и я думаю, что причина в том, что я не понимаю, как работают ключи API.

Если я хочу, чтобы Discourse делал запрос к API для получения информации о группе каждый раз, когда любой пользователь посещает определённую страницу, как правильно настроить ключ API?

Вот что у меня есть на данный момент:

В моей панели управления я перешёл в раздел API → Новый ключ API. Там нужно выбрать «Уровень пользователя» (User Level). Извините за простой вопрос, но что означает «Уровень пользователя» здесь? (вызов API должен выполняться каждый раз, когда любой пользователь переходит на указанную страницу).

Я выбрал «Все пользователи» (All Users), а затем сгенерировал токен.

Затем в панели кастомизации CSS/HTML внутри тега < /head> я добавил следующее между соответствующими тегами :

var groupName = [НАЗВАНИЕ ГРУППЫ]
var token = [СГЕНЕРИРОВАННЫЙ ТОКЕН]
$.ajax({
     url: 'https://myforum.com/groups/groupName.json',
      contentType: "application/json",
      headers: {
          "Api-Key": token,
          "Api-Username": "system"
        },
        dataType: 'json',
        success: function(result){
             console.log('result = ' + result);
         }
})

Код выполняется, но возвращает ошибку «не авторизован» (хотя я являюсь администратором и состою в группе, которую использую для экспериментов).

Что мне нужно изменить?

Разве это не приведет к тому, что ваш API-ключ «Все пользователи» станет доступен всем, кто просматривает ваш сайт? Думаю, вам придется найти другой подход для получения данных о группах из компонента темы.

Если нужная вам информация о группе отсутствует в JSON-загрузке, доступной пользователю, вам необходимо найти способ добавить её в сериализатор. Поиск по запросам «add to serializer», «addToSerializer» или «add_to_serializer» в существующих компонентах тем и плагинах может помочь.

Но разве код не должен работать в любом случае? API предоставляет возможность получить информацию о группе. Я всё ещё не совсем понимаю, как это должно работать, наверное.

Какой нормальный способ использования API для получения информации о конкретной группе?

Ключевая информация, которая мне нужна, — это то, является ли пользователь владельцем группы или нет. Эта информация возвращается через JSON API. Таким образом, когда пользователь переходит на определённую страницу, я хочу сделать запрос к API, чтобы получить данные о группе, которые в базовом ответе включают информацию о том, является ли вошедший в клиент пользователь владельцем.

Это кажется прямой реализацией работы с API. Однако, похоже, что для этой операции требуется API-ключ, но используемый мной метод пока не работает.

Я не думаю, что создание отдельного плагина или компонента темы здесь необходимо, так как эта операция является одной из базовых, предоставляемых JSON API.

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

РЕДАКТИРОВАНИЕ: Если по какой-то причине это не подходит для вызова API, то да, данные придётся сериализовать. У кого-нибудь есть рабочий код для этого? Я понимаю, что существует метод add_to_serializer, но мне не удаётся правильно настроить синтаксис, и я с трудом нахожу рабочие примеры использования этого метода.

Уважаемый @JQ331,

Да, я быстро проверил это для вас (в качестве примера): вошел в тестовый форум как сотрудник и получил группу staff, получив ожидаемые результаты:

JSON-объект для группы staff от имени сотрудника
{
  "group": {
    "id": 3,
    "automatic": true,
    "name": "staff",
    "display_name": "staff",
    "user_count": 1,
    "mentionable_level": 0,
    "messageable_level": 0,
    "visibility_level": 1,
    "automatic_membership_email_domains": null,
    "primary_group": false,
    "title": null,
    "grant_trust_level": null,
    "incoming_email": null,
    "has_messages": false,
    "flair_url": null,
    "flair_bg_color": null,
    "flair_color": null,
    "bio_raw": null,
    "bio_cooked": null,
    "bio_excerpt": null,
    "public_admission": false,
    "public_exit": false,
    "allow_membership_requests": false,
    "full_name": null,
    "default_notification_level": 3,
    "membership_request_template": null,
    "is_group_user": true,
    "is_group_owner": true,
    "members_visibility_level": 0,
    "can_see_members": true,
    "publish_read_state": false,
    "is_group_owner_display": false,
    "mentionable": false,
    "messageable": false
  },
  "extras": {
    "visible_group_names": [
      "admins",
      "moderators",
      "staff",
      "trust_level_0",
      "trust_level_1",
      "trust_level_2",
      "trust_level_3",
      "trust_level_4"
    ]
  }
}

… а также попробовал сделать то же самое в режиме без авторизации и получил ожидаемый результат:

{"errors":["У вас нет разрешения на просмотр запрошенного ресурса."],"error_type":"invalid_access"}

Таким образом, это означает, или, по крайней мере, мне так кажется, что всё работает как положено.

К сведению @JQ331: для этого действия, будучи авторизованным пользователем (из браузера), ключ API не требовался.

    "is_group_owner": true,

@neounix: Большое спасибо за ваш ответ. Это прекратило мою бессмысленную погоню. Я думал, что причина получения ответа «неавторизовано» заключалась в проблеме с аутентификацией.

Оказывается, вы правы: для этого действия не требуется ключ API. Скорее, это была (простая) ошибка в коде, которая очевидна из приведенного выше кода, но которую я упустил ранее (я неправильно подставлял переменную для URL-адреса AJAX).

Вот рабочий код:

var groupName = [СООТВЕТСТВУЮЩЕЕ НАЗВАНИЕ ГРУППЫ]
var token = [СГЕНЕРИРОВАННЫЙ МНОЙ ТОКЕН]
$.ajax({
     url: 'https://myforum.com/groups/' + groupName + '.json',    // здесь была старая ошибка
      contentType: "application/json",
        dataType: 'json',
        success: function(result){
             console.log('полный ответ = ' + JSON.stringify(result));
             console.log('я владелец группы = ' + result.group.is_group_owner);  // обратите внимание, это будет либо true, либо null           
     }
})

Раньше я получал ответ «неавторизовано», потому что в предыдущем URL-адресе, который я вводил, было неверное название группы (оно воспринималось как “groupName”).