2016-11-27 3 views
10

Я застрял в проблеме с шлюзом API, и я прошел через все остальные ответы SO на этом форуме AWS и прошел через их docs, но до сих пор нет радости.AWS API Gateway Нет заголовка «Access-Control-Allow-Origin»

Я пытаюсь настроить API с помощью AWS API-шлюза, который вызывает функцию Lambda, которая читает/записывает в таблицу в DynamoDB.

Работает функция Lambda для DynamoDB. Я создал API в AWS и создал для него методы GET и OPTIONS. Я прочитал, что AWS не применяет OPTIONS только для GET/POST, но я получал ошибку перед полетом в моем вызове ajax, когда не было метода OPTIONS, поэтому я добавил его.

На данный момент только для достижения прогресса Я не использую ключ API или авторизацию. Я могу успешно вызвать метод GET с помощью POSTMAN, который возвращает содержимое таблицы DynamoDB.

Но когда я пытаюсь с помощью AJAX вызова JQuery я получаю

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 

Я могу видеть с помощью Chrome Dev инструментов на вкладке сети, метод OPTIONS статус 200 возвращения и GET возвращает статус 200, но с вышесказанным ошибка.

Я попытался включить CORS как в методах OPTIONS, так и GET, повторно развернул API после каждого изменения, попробовал следующее (http://enable-cors.org/server_awsapigateway.html), но всегда получал ту же ошибку в консоли.

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

Когда я включил CORS на моем GET и OPTIONS я могу видеть, что Access-Control-Allow-Headers является 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' и Access-Control-Allow-Origin * является '*'

Мой Ajax вызов выглядит, как показано ниже. Я также попытался скопировать точные заголовки POSTMAN использует, который имеет набор заголовков авторизации (который я поворачивал в AWS в настоящее время), но я всегда получаю ту же ошибку выше

var awsHeaders = {}; 
awsHeaders['X-Amz-Date'] = '20161127T171734'; 

$('#add, #cloud').click(function() { 

    $.ajax({ 

     type: 'GET', 
     headers: awsHeaders, 
     dataType : "json", 
     url: '...', 
     success: function (res) { 

      console.log('response in GET:'); 
      console.log(res); 

     }, 
     error: function(data) { 
      console.log('in error'); 
      console.log(data); 
     } 

    }); 

}); 

Может кто-нибудь пролить свет на то, что я мог бы отсутствовать?

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

Update См ответ ниже относительно того, как я решил эту проблему в соответствии с комментариями DigitalKapteain - установив «Access-Control-Allow-Origin»: «*» заголовок в ответ от моего Lambda функция. Я искал это в документах AWS, но не смог найти его. Эта ссылка описывает разницу между Lambda и Lambda Proxy и объясняет, что делать при использовании CORS https://serverless.com/framework/docs/providers/aws/events/apigateway/

+0

Возможно, вы ничего не пропустили, и это может быть проблема кэширования интернет-провайдера, попробуйте другое подключение к Интернету и новый браузер, если нет, то CORS может быть проблемой – Waheedi

+0

Спасибо. Я не думаю, что это проблема интернет-провайдера, поскольку я пробовал это на разных сетевых подключениях (кафе, гостиница и т. Д.). Также очистили кэшированные и т. Д. И попробовали разные браузеры – user12345

+0

Тогда его CORS @ user12345 Я думаю, что вы уже видели эту документацию, но попробуйте дважды проверить, что вы снова прошли шаги, http://docs.aws.amazon.com/apigateway/latest /developerguide/how-to-cors.html – Waheedi

ответ

22

Ответ на запрос GET функции Lambda также должен содержать заголовок Access-Control-Allow-Origin.

+0

Спасибо @ Digitalkapitaen. Глядя на заголовки ответов, возвращенные из запроса OPTIONS, он содержит методы Access-Control-Allow-Methods: GET, OPTIONS и Access-Control-Allow-Origin: *, но я не вижу заголовок ответа Access-Control-Allow-Origin для запрос GET. Я установил его в методе GET Method Response of gateway API и повторно развернул API, но я не вижу его возврата. Любая идея, где еще это нужно установить? Большое спасибо – user12345

+2

@ user12345 Используете ли вы интеграцию с Lambda Proxy или настроили ли лямбда-вызов вручную в API-шлюзе? Если вы используете Proxy Integration, вы должны установить заголовок в свой код Lambda. – Digitalkapitaen

+3

Я использую интеграцию Lambda Proxy. Поэтому я изменил функцию Lambda, чтобы вернуть заголовок «Access-Control-Allow-Origin»: '*' и voila. Ошибка управления доступом исчезла. Большое спасибо за вашу помощь. Таким образом, при использовании интеграции с прокси-сервером заголовки устанавливаются функцией Lambda, а не обработкой метода в шлюзе API? – user12345

6

Ответ Digitalkapitaen правильный; Вот код, чтобы спасти кому-то неприятности, глядя вверх how to set an HTTP response header in Lambda:

exports.handler = function(event, context, callback) { 
    callback(null, { 
     "statusCode": 200, 
     "headers": { 
      "Access-Control-Allow-Origin": "*" 
     } 
    }); 
}; 
2

Если это все еще не работает для вас, убедитесь, что JSON.stringify() ваш объект JSON, если вы используете $ .ajax. Если нет, вам все равно будет возвращена ошибка, которая, как утверждается, является связанной с CORS ошибкой.Но если вы отправите тот же json-объект, используя Postman, запрос будет успешным. Попробуйте ...

+0

Это. Я видел код статуса 415, потому что я отправлял данные формы вместо JSON. Хотя это выглядело как проблема, связанная с CORS в консоли, проблема была в этом. –