JQuery предполётный запрос CORS - PullRequest
0 голосов
/ 19 ноября 2018

Я пишу веб-карту и пытаюсь получить JSON из веб-ресурса, для которого у меня есть учетные данные.Это прекрасно работает в Python, работающем через ноутбук JuPyteR:

import requests
header = {  "Accept": "application/json, text/plain, */*",
        "Accept-Language": "de-DE",
        "Content-Type": "application/json",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "Origin": "https://myCoolServer.azurewebsites.net"}
}
dataJSON = json.dumps({ "username": "XXX",
    "password": "XXX"}).encode('utf8')
url = "URL/v1/token"
r = requests.post(url, data=dataJSON, headers=header)

Запрос от python дает следующий заголовок:

'User-Agent': 'python-requests/2.19.1', 
'Accept-Encoding': 'gzip, deflate', 
'Accept': 'application/json, text/plain, */*', 
'Connection': 'keep-alive', 
'Accept-Language': 'de-DE', 
'Content-Type': 'application/json', 
'Pragma': 'no-cache', 
'Cache-Control': 'no-cache', 
'Content-Length': '67',
'Origin': 'https://myCoolServer.azurewebsites.net'

Теперь я пытаюсь воссоздать это в JavaScript, чтобы получить данныев моей веб-карте:

$.ajax ({
          method: 'POST',
          data: JSON.stringify({ "username": name,
    "password": pass}),
    headers:  {
        "Accept": "application/json, text/plain, */*",
        "Accept-Language": "de-DE",
        "Content-Type": "application/json",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache"
      },
          dataType:'json',
          url:'URL/v1/token',
          error: function() {
            alert("Login failed. Check username/password!");
          },
          success: function(resp) {

            token=resp.token;
          }

Консоль показывает следующий заголовок для вызова параметров предварительной проверки:

Host: "cool API"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-DE
Accept-Encoding: gzip, deflate, br
Access-Control-Request-Method: POST
Access-Control-Request-Headers: cache-control,content-type,pragma
Origin: https://myCoolServer.azurewebsites.net
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Ответ параметров предварительной проверки от сервера является успешным с точки зрения ответа 200.Тем не менее, я не заканчиваю POST, поскольку консоль в FF и Chrome дает мне:

Origin https://myCoolServer.azurewebsites.net not found in Access-Control-Allow-Origin header.

Заголовок ответа от сервера дает мне:

HTTP/1.1 200 OK
Date: Mon, 19 Nov 2018 08:07:30 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: no-cache, private
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, PUT, GET, DELETE, OPTIONS
Access-Control-Allow-Headers: cache-control,content-type,pragma
Access-Control-Max-Age: 3600
Access-Control-Allow-Origin: null
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Как и вся идеяработает в Python, я надеюсь, что смогу "подражать" поведению в Javascript / Jquery.Поэтому я ищу ваши замечания / подсказки.

Примечание: все работает в JS при работе на Chrome с использованием плагина CORS ...

Ответы [ 2 ]

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

Правила CORS применяются главным образом клиентом, а не сервером. Сценарий Python не реализует эти правила, поэтому запрос выполняется успешно, но ваш браузер реализует их и блокирует запрос.

Теперь сервер должен предоставлять клиенту информацию о том, разрешать ли запрос CORS. Предварительный запрос предназначен только для получения этой информации (поскольку ваш запрос не является «простым запросом», см. this doc ). В вашем случае сервер явно не настроен:

Access-Control-Allow-Origin: null

Вы должны иметь "*" вместо нуля или, по крайней мере, "https://myCoolServer.azurewebsites.net".

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

Python не проверяет CORS, а браузер делает, чтобы избежать проблем безопасности, таких как XSS,

Необходимо заставить сервер отвечать заголовку «Access-Control-Allow-Origin» доменом, с которого конечная точкавызывается ("https://myCoolServer.azurewebsites.net"?)

Если вы хотите, чтобы сервер разрешал вызов для любого использования домена:

" Access-Control-Allow-Origin: * "

(в настоящее время "Access-Control-Allow-Origin: null")

Это необходимо, поскольку браузер должен знать, ожидает ли этот сервер вызова из этого домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...