Я разрабатываю фрагмент javascript для извлечения некоторых данных через API общедоступного веб-сервиса.
Требуется два шага: базовая аутентификация, когда вы получаете токен с помощью запроса POST, а затем вы можете получить доступ к защищенной части веб-службы.
Мне удалось запустить некоторый код, и я смог получить токен без проблем.
Когда я пытаюсь отправить свой второй запрос, POST или GET, с аутентификацией: bearer + token header, я должен получить ответ (XML-документ).
Этот второй запрос не выполняется на предполетном этапе, но не всегда.
Я попытался запустить тот же код на моем персональном ноутбуке (linux, firefox 64) дома. Все хорошо, и работает безупречно.
Когда я запускаю его на своем профессиональном компьютере на работе (Windows 7, Firefox 52 и Firefox 60), это дает сбой. НО не этим утром ...
Сегодня утром, с тем же кодом, мне удалось получить доступ к API в обязательном порядке.
И теперь, это снова терпит неудачу.
Ошибка возникает при запросе OPTIONS, автоматически выполняемом firefox перед вторым запросом POST, и сообщение:
«Блокада потребностей в множественном происхождении (запрос о перекрестном происхождении): политика« Одно и то же происхождение »и постоянный консультант по ресурсам удаленного региона * https://apublicwebsite.com. Обоснование: канал проверки подлинности запрашивает CORS».
По сути, это переводится как «Блокировка запросов между источниками: политика« Тот же источник »не разрешает доступ к удаленному ресурсу, расположенному по адресу https://apublicwebsite.com. Причина: сбой канала проверки запроса CORS».
Вот полный заголовок запроса перед полетом:
Accept text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate, br
Accept-Language en-US,fr;q=0.8,fr-FR;q=0.5,en;q=0.3
Access-Control-Request-Headers authorization
Access-Control-Request-Method POST
Connection keep-alive
Host ops.epo.org
Origin null
User-Agent Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/60.0
и заголовок ответа, возвращаемый с кодом 403 ЗАПРЕЩЕНО:
Access-Control-Allow-Headers Authorization
Access-Control-Allow-Methods POST
Access-Control-Allow-Origin *
Connection keep-alive
Content-Length 207
Content-Type application/xml
Date Mon, 14 Jan 2019 14:20:05 GMT
X-EPO-Client-IP XXX.XXX.XX.XX
X-EPO-Forwarded XXX.XXX.XX.XX
X-Rejection-Reason AnonymousQuotaPerDay
Ответ заголовка предполётной проверки имеет свойство "X-Rejection-Reason", значение которого равно "AnonymousQuotaPerDay", что указывает на то, что я превысил анонимную квоту (которая равна 0 в этом веб-сервисе, поскольку они не допускают анонимных пользователей). Таким образом, это означает, что предварительный запрос не аутентифицируется с токеном-носителем. Насколько я понимаю, как работает предпечатная проверка, он не должен в ней нуждаться, поскольку цель такой предварительной проверки состоит в проверке заголовков для междоменной авторизации. И ответ возвращается с заголовком, допускающим междоменный домен (allow-origin равен "*").
В конце концов, я не думаю, что здесь виноват код. Тогда это может быть поведение Firefox, брандмауэра компании или удаленного сервера.
Может ли кто-нибудь пролить на это странное поведение?
fetch('https://ops.epo.org/3.2/auth/accesstoken',
{
method: 'POST',
headers:{
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + window.btoa(userName:secretKey)
},
body: 'grant_type=client_credentials'
}
)
.then( //authentication fetch.then
(resp) => resp.json())
.then( // json.then
function (data){
getData(data.access_token, appNumber);
return;
}
)
//getData function
fetch('https://ops.epo.org/3.2/rest-services/published-data/publication/epodoc/biblio',
{
method: 'POST',
headers:{
'Content-Type': 'text/plain',
'Authorization': 'Bearer '+ token
},
body: appNumber
}
)
.then( //fetch 2.then
(resp2) => resp2.text())
.then (//do some things with the answer)