Аномальные результаты API

Привет!

Я пытаюсь выполнить вызов API для создания новой темы. Discourse API Docs

Используя Postman, я отправляю API-ключ, имя пользователя и Content-Type в заголовках, а JSON-данные — в теле запроса.

Я проверил, что API-имя пользователя и ключ верны, но вызов API возвращает HTML-страницу входа в систему.

Это ожидаемое поведение? Как можно обойти эту проблему?

Не могли бы вы вставить версию API-вызова на cURL, которую вы пытаетесь выполнить?

Конечно…

curl -X POST 'https://staging-discuss.newrelic.com/posts.json' \
     -H 'Api-Username: RyanVeitch' -i \
     -H 'Api-Key: My-API-Key' -i \
     -H 'Content-Type: application/json' \
     -d \
'{
    "title": "Мой замысловатый заголовок",
    "raw": "Какой-то случайный текст для заполнения моей темы",
    "category": 212,
    "created_at": "2020-06-22"
}'

В терминале я получаю следующий вывод:

HTTP/1.1 307 Временное перенаправление
Proxied-By: Service Gateway
Strict-Transport-Security: max-age=31536000; includeSubDomains
Location: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json
content-type: text/plain;charset=UTF-8
content-length: 138

Перенаправление на другой URI: https://staging-login.newrelic.com/login?return_to=https%3A%2F%2Fstaging-discuss.newrelic.com%2Fposts.json%

Дайте знать, если с моей стороны потребуется что-то ещё для помощи в устранении неполадок :smiley:

Похоже, у вас очень нестандартная конфигурация с прокси-сервером посередине.

Это не является стандартным поведением Discourse, поэтому, судя по всему, причина кроется в вашем специальном прокси-решении.

Возможно, есть какой-то специальный заголовок, который можно отправить, чтобы обойти прокси? Нужно проверить документацию по этому продукту.

Круто! Спасибо @Falco — я подключу нашу команду разработчиков :slight_smile:

Привет, @Falco! Мне удалось пройти через прокси, но теперь я получаю ошибки 403 BAD CSRF.

Кажется, эта тема осталась незавершённой…

Есть ли у тебя какие-то идеи, как обойти эти ошибки?

Я только что протестировал ваш пример команды curl локально, и у меня всё работает отлично, значит синтаксис верный. Возможно, прокси удаляет некоторые заголовки? Это могло бы стать причиной ошибок BAD CSRF, так как в таком случае он больше не может читать/получать доступ к учётным данным API.

Спасибо, @blake

Наш прокси — это полностью кастомное решение собственной разработки, которое служит фронтенд-слоем для публичного доступа.

Я подключен через VPN к нашей внутренней сети и обращаюсь не к публичному URL, а к бэкенд-URL (находящемуся за прокси), поэтому запросы не должны проходить через прокси.

Наша тестовая версия Discourse — 2.3.10.

Ведёт ли API себя иначе в этой версии?

Нет, в версии v2.3.10 по-прежнему присутствует вся аутентификация на основе заголовков, поэтому поведение не должно измениться.

Вы попадаете на эту строку:

что означает, что ваш запрос составлен некорректно каким-то образом, и система не может определить, что это API-запрос.

Поскольку это тестовый экземпляр, а не локальная среда, перед обращением к Discourse должен работать nginx или другой веб-сервер. Возможно, nginx удаляет некоторые заголовки в зависимости от вашей конфигурации. Эта информация может отображаться в логах nginx.

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

@blake

Спасибо! Я обсудю это с нашей командой разработчиков :smiley:

Очень ценю вашу помощь