Ошибочные сбои извлечения javascript в firefox из-за отсутствия перекрестной политики - PullRequest
0 голосов
/ 14 января 2019

Я разрабатываю фрагмент 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)
...