API вызывается с помощью node.js fetch ведет себя иначе, чем в браузере

#node.js #csv #fetch

Вопрос:

Я использую node.js чтобы получить некоторые данные на веб — сайте, использующем Rest API. Первые шаги :

  • Подключитесь к API аутентификации и получите токен аутентификации (JWT)
  • Используйте этот токен для последующих вызовов

Пока все работает нормально, я получил большую часть нужных мне данных. Пока мне не понадобилось получить данные из возвращенного CSV-файла из API. Это также в два этапа :

  1. Получите маркер файла (другой JWT, чем аутентифицированный) : www.site.fr/api/campain/[CampainID]
  2. Получите CSV-файл : www.site.fr/api/campain/[CampainID]/getfile?token=tokenFromPreviousStep

По некоторым причинам, если я использую тестер API (например, talend API), я получаю токен, вызываю файл, все в порядке. Если я сделаю это с помощью fetch : я действительно получу файл, но заголовок CSV неверен !!

Подводя итог, вы можете получить два типа «campain», назовем их «TypeA» и «TypeB», каждый тип возвращает данные CSV с разными заголовками. При использовании выборки узлов при запросе CSV-файла TypeA я получаю правильные записи, но с заголовком TypeB… таким образом, данные неверны, потому что сервер пытается получить некоторые данные, которых у него нет.

Где это становится действительно сложным, так это в том, что :

  • Если я получу маркер файла (шаг 1) с помощью тестера API
  • Затем я вызываю CSV с помощью fetch -> все хорошо

В то время как если я получу маркер файла с помощью fetch и использую его в следующем вызове -> неправильные заголовки CSV.

Это соответствующий код для статического примера:

 // Step 1 get the Campain Token
const campainCall = await fetch("https://website.fr/api/campaigns/251611", {
   { method: "GET", headers: { Authorization: "Bearer AuthentJWT" } }
});
const campaignInfos = await campainCall.json();
const campainToken = "accessToken="   campaignInfos.data.attributes['token-for-campaign-results'];

const fetchURL = campainURL   "251611"   endpoint   campainToken;

// Step 2 get the CSV file
const resp = await fetch(fetchURL,
    { method: "GET", headers: { Authorization: "Bearer AuthentJWT" } });
const respCSV = await resp.text();
console.log(respCSV);
 

Что еще нужно знать :

  • У меня нет ответа 401, токен аутентификации работает нормально
  • Как только я получаю правильный файл токен, я могу получить правильный файл либо с браузера вставьте URL-адрес/API тестер/принеси это всегда работает -даже в свежем частная сессии браузера, если я вставить URL-адрес с файлом токен, я получаю правильные данные, так, кажется, это имеет ничего общего с потенциальными файлов cookie
  • Если маркер неправильный, файл, который я получаю, всегда неправильный (браузер/выборка)
  • Единственный способ, которым я получаю «неправильный» токен, — это получить его из вызова выборки узла
  • Я не вижу структурной разницы между «правильным» и «неправильным» файловым маркером :
    • Хороший знак : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NfaWQiOjEwMjM2ODIsImlhdCI6MTYxNjE3MjA2MiwiZXhwIjoxNjE2MTc1NjYyfQ.oUeJP3TzTml1ECpqfTKr8o3UP9dkhG6FTWF24kNiW2I
    • неправильный знак : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2Nlc3NfaWQiOjEwMjM2ODIsImlhdCI6MTYxNjE3MjI2NywiZXhwIjoxNjE2MTc1ODY3fQ.sWWw6fO-iXqPCZvaDqYQyxLTAw3OgMWKOZDgbedK2dk
  • Я попытался скопировать запрос на извлечение узла из инструмента chromedev, чтобы посмотреть, есть ли разница : ничего, токен, который я получаю из выборки, «неправильный», когда тот же самый вызов дал мне хороший токен в браузере.

Я знаю, что это невозможно воспроизвести, но если кто-нибудь даст какой-нибудь совет о том, как я мог бы попытаться все отладить, у меня закончились идеи…

Большое спасибо.

Комментарии:

1. Вы можете использовать jwt.io чтобы декодировать эти JWT, оба они одинаковы, с той лишь разницей, что метки времени issue_at и истечения срока действия. Кроме того, как насчет Content-Type заголовка? можете ли вы проверить, одинакова ли она в обоих типах запросов? И последнее, не могли бы вы показать, в чем разница в ответах?

2. Другой вопрос: когда вы говорите о неправильности «заголовков», вы имеете в виду заголовки CSV или заголовки http-ответов?

3. @germanio спасибо, я проверил jwt.io, идентификатор доступа-это мой идентификатор пользователя. Идентификатор файла указан в URL-адресе. Я попытаюсь добавить пример хорошего CSV Против плохого CSV, но поясню : если я ожидаю 7 строк с столбцом 1, столбцом 2… Я получаю в плохом CSV 7 строк, но с столбцом B1, столбцом B2… Я действительно говорю о заголовке CSV. Я предполагаю, что, поскольку проблема связана с маркером файла, предоставленным с помощью fetch, это связано с тем, как fetch выполняет вызов, но, как я уже сказал, я скопировал тот же вызов из devtool и получил неправильный маркер. Я еще раз проверю заголовки, спасибо за треки.