Запросы почтальона получают код состояния HTTP 401

Я работаю над созданием REST API Node.js, используя модуль Express, который перенаправляет запросы HTTP GET и PUT на другой сервер. Однако при выполнении тестовых запросов в Postman я всегда получаю ответы HTTP 401 Unauthorized. Тем не менее, когда я пробую то же самое с запросом в браузере Chrome, я получаю успешный ответ (HTTP 302). Я прочитал некоторую документацию по циклу HTTP-запроса / ответа и авторизации. Сервер, на который я перенаправляюсь, использует аутентификацию HTTP Basic. В моем коде я перенаправляю вызов API на свой сервер приложений с помощью метода res.redirect (server). В моем запросе почтальона я устанавливаю имя пользователя / пароль на вкладке авторизации для моего запроса. Я знаю, что это кодируется с использованием base64, но я предполагаю, что это не передается при перенаправлении, когда это делается через Postman.

Следующие фрагменты кода показывают, что я уже создал.

Это экспресс-маршрут, который я создал для запросов GET.

app.get('/companyrecords/:name', function(req, res) {

  var credentials = Buffer.from("username:password").toString('base64');
  console.info(req);
  var requestURL = helperFunctions.createURL(req);

  res.redirect(requestURL);
});

Я определяю функцию createURL внутри файла helperFunctions. Цель этой функции - настроить URL-адрес, на который будут направляться запросы. Вот код этой функции.

module.exports.createURL = function (requestURL) {
  var pathname = requestURL._parsedUrl.pathname;
  var tablename = pathname.split("/")[1];
  var filter = `?&filter=name=\'${requestURL.params.hostname}\'`;

  var fullPath = BASE_URL + tablename.concat('/') + filter;

  console.info(fullPath);
  return fullPath;
}

Где BASE_URL - константа, определенная в следующей форме:

http: // имя хоста: порт / путь / к / ресурсу /

Это что-то, что мне нужно изменить в моем коде для поддержки перенаправления через Postman, или есть параметр в Postman, который мне нужно изменить, чтобы мои запросы могли успешно выполняться.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
3 468
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, вы не можете сказать Почтальону не делать того, что, возможно, было правильным.

Фактически клиенты должен удаляют заголовки авторизации при перенаправлении. Это сделано для того, чтобы злоумышленник не вставил 302 и не собрал все ваши имена пользователей и пароли на своем собственном сервере. Однако, как вы заметили, многие клиенты ведут себя не идеально (и с тех пор сохранили это поведение по устаревшим причинам).

Как обсуждалось здесь, однако у вас есть несколько вариантов:

  • Разрешить вторичный способ авторизации с использованием строки запроса: res.redirect(302, 'http://appServer:5001/?auth=auth'), однако это не очень хорошо, потому что строки запроса часто регистрируются без редактирования.
  • Действовать как прокси и самостоятельно передавать аутентифицированный запрос: http.request(authedRequest).on('response', (response) => response.pipe(res))
  • Ответьте 200 и укажите ссылку для вашего клиента.

Если бы я использовал второй указанный вами метод, мне не нужно было бы правильно называть метод Express 'res.redirect? Вместо этого я бы использовал HTTP-модуль Node.js, чтобы передать ответ обратно клиенту.

Eddie 29.10.2018 23:31

Да, значит, ваш сервер обрабатывает перенаправление за вас. Четвертый ответ - признать, что почтальон не подходит для тестирования этого, потому что браузеры ведут себя по-разному, и проверить заголовок Location в ответе и повторно сделать запрос. Хотя это означает, что ваш API не будет работать ни с чем, кроме браузеров.

thomasmichaelwallace 30.10.2018 08:40

О, правда, есть ли способ написать API, который перенаправляет на другой сервер, который будет работать с HTTP-клиентами, отличными от веб-браузеров? Если нет, значит, я зря трачу время. У меня нет большого опыта работы с API-интерфейсами программирования, но я уверен, что это не первый раз, когда кто-то пытается создать API с перенаправлением HTTP-запросов.

Eddie 30.10.2018 15:57

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

Eddie 30.10.2018 15:57

Итак, я как бы понял, что делать. Вместо того, чтобы пытаться внедрить HTTP-заголовок авторизации в существующий объект req, переданный в экспресс-маршрут, я вместо этого создал новый запрос, используя встроенный HTTP-модуль Node.js. Затем я передал бы параметры из исходного объекта req новому запросу. Ниже приведен пример кода, который я написал для этого. // Обновлено: переполнение стека ограничивает количество символов в моих сообщениях.

Eddie 30.10.2018 20:02

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

thomasmichaelwallace 30.10.2018 20:07

Да, я смотрел на это. Хотя сейчас я столкнулся с другой проблемой. Это образец моего кода. app.get ('/ companyrecords /: name', function (req, res) {const options = {hostname: 'myhost', ... auth: 'username: password'}} const myAppReq = http.request (options, (myAppRes) => {console.info (STATUS: ${myAppRes.statusCode}); myAppRes.on ('data', (chunk) => {res.send (chunk);}); myAppRes.on ('end', () => { res.end ('Больше данных для отправки.');});}); // myAppReq.write (''); myAppReq.end ();});

Eddie 30.10.2018 20:08

Хорошо, ты можешь задать это в другом вопросе? Как видите, комментарии отлично подходят для более подробного обсуждения / обмена новым кодом.

thomasmichaelwallace 30.10.2018 20:10

Конечно, я обязательно это сделаю. Спасибо за ваш вклад и за то, что поделились со мной своим мнением по этому поводу. Надеюсь, это поможет другим в том же поиске, что и я. Я определенно много узнал об API и спецификации HTTP.

Eddie 30.10.2018 20:23

Другие вопросы по теме