Я работаю над созданием 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, который мне нужно изменить, чтобы мои запросы могли успешно выполняться.
К сожалению, вы не можете сказать Почтальону не делать того, что, возможно, было правильным.
Фактически клиенты должен удаляют заголовки авторизации при перенаправлении. Это сделано для того, чтобы злоумышленник не вставил 302 и не собрал все ваши имена пользователей и пароли на своем собственном сервере. Однако, как вы заметили, многие клиенты ведут себя не идеально (и с тех пор сохранили это поведение по устаревшим причинам).
Как обсуждалось здесь, однако у вас есть несколько вариантов:
res.redirect(302, 'http://appServer:5001/?auth=auth')
, однако это не очень хорошо, потому что строки запроса часто регистрируются без редактирования.http.request(authedRequest).on('response', (response) => response.pipe(res))
Да, значит, ваш сервер обрабатывает перенаправление за вас. Четвертый ответ - признать, что почтальон не подходит для тестирования этого, потому что браузеры ведут себя по-разному, и проверить заголовок Location в ответе и повторно сделать запрос. Хотя это означает, что ваш API не будет работать ни с чем, кроме браузеров.
О, правда, есть ли способ написать API, который перенаправляет на другой сервер, который будет работать с HTTP-клиентами, отличными от веб-браузеров? Если нет, значит, я зря трачу время. У меня нет большого опыта работы с API-интерфейсами программирования, но я уверен, что это не первый раз, когда кто-то пытается создать API с перенаправлением HTTP-запросов.
Чтобы дать вам более четкое представление, я пытаюсь использовать Node.js для расширения функциональности приложения моей компании. Приложение представляет собой корпоративную программную систему, имеющую собственный собственный API. Однако, поскольку мы внесли много изменений в базовую базу данных, я не уверен, что собственный API поддержит нас с запросами и добавлением записей в эти настраиваемые таблицы. Единственное другое решение, которое я мог придумать, - это создать новый API с нуля, и это было бы полным отстоем.
Итак, я как бы понял, что делать. Вместо того, чтобы пытаться внедрить HTTP-заголовок авторизации в существующий объект req, переданный в экспресс-маршрут, я вместо этого создал новый запрос, используя встроенный HTTP-модуль Node.js. Затем я передал бы параметры из исходного объекта req новому запросу. Ниже приведен пример кода, который я написал для этого. // Обновлено: переполнение стека ограничивает количество символов в моих сообщениях.
В самом деле - это очень типичный подход в дизайне API - сбор данных из различных источников и их последующее возвращение. Хотя обратите внимание, если все, что вы в буквальном смысле делаете, - это обертывание запроса, то его конвейерная обработка сделает вас более отзывчивым и сэкономит память по сравнению с загрузкой ответа с последующей его пересылкой.
Да, я смотрел на это. Хотя сейчас я столкнулся с другой проблемой. Это образец моего кода. 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 ();});
Хорошо, ты можешь задать это в другом вопросе? Как видите, комментарии отлично подходят для более подробного обсуждения / обмена новым кодом.
Конечно, я обязательно это сделаю. Спасибо за ваш вклад и за то, что поделились со мной своим мнением по этому поводу. Надеюсь, это поможет другим в том же поиске, что и я. Я определенно много узнал об API и спецификации HTTP.
Если бы я использовал второй указанный вами метод, мне не нужно было бы правильно называть метод Express 'res.redirect? Вместо этого я бы использовал HTTP-модуль Node.js, чтобы передать ответ обратно клиенту.