Прокси для получения URL-адреса с помощью AWS Lambda - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь включить новостную ленту в приложение Ionic, которое разрабатываю, консультируясь по каналам с других веб-сайтов. Но для некоторых URL каналов приложение жалуется на отсутствие параметра Access-Control-Allow-Origin. Поэтому я создал лямбда-функцию, которая получает содержимое из параметра канала url и возвращает его клиенту, добавляя Access-Control-Allow-Origin в заголовок ответа. Вы можете увидеть код ниже:

const https = require('https');

exports.handler = (event, context, callback) => {
    var url = event.queryStringParameters.url;
    https.get(url, (res) => {
      console.log('statusCode:', res.statusCode);
      console.log('headers:', res.headers);

      res.setEncoding('utf8');
      let rawData = '';
      res.on('data', (chunk) => { 
        rawData += chunk; 
      });

      res.on('end', () => {
        try {
         const response = {
            statusCode: 200,
            headers: {
              'Content-Type': 'text/xml, application/xml',
              'Access-Control-Allow-Origin': '*',
              'Access-Control-Allow-Headers': '*'
            },
            body: rawData,
          };

          // callback is sending HTML back
          callback(null, response);
        } catch (e) {
          console.error(e.message);
          callback(e);
        }
      });
    }).on('error', (e) => {
      console.error(e);
      callback(e);
    });
};

Это работает для большинства URL, но только для одного (https://www.passblue.com/feed/) Я заблокирован их брандмауэром. Он возвращает мне следующее сообщение:

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

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

Кто-нибудь видел такое поведение раньше?

1 Ответ

0 голосов
/ 06 ноября 2018

Мне удалось решить эту проблему, заменив модуль узла https на node-fetch npm. Я предполагаю, что более новый подход устанавливает более высокие заголовки в запросе (напоминает меньше атаки DDOS).

const fetch = require('node-fetch');

exports.handler = (event, context, callback) => {
    var url = event.queryStringParameters.url;

    fetch(url).then((res) => {
      return res.text();
    }).then((body) => {
        const response = {
           statusCode: 200,
           headers: {
             'Content-Type': 'text/xml, application/xml',
             'Access-Control-Allow-Origin': '*',
             'Access-Control-Allow-Headers': '*'
           },
           body,
        };
        callback(null, response);
    }).catch('error', (e) => {
      console.error(e);
      callback(e);
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...