Запрос токена OneDrive oAuth получает ошибку CORS

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

Код успешно извлекается приложением, но при вызове https://login.live.com/oauth20_token.srf запрос завершается ошибкой CORS.

См. прикрепленное изображение для заголовков HTTP из моей консоли javascript в Chrome. В ответе сервера отсутствует заголовок

Access-Control-Allow-Origin:, что вызывает ошибку CORS

Как включить доступ CORS для моего приложения? Я не вижу никаких опций в консоли разработчика?

Спасибо! введите здесь описание изображения


person user1936097    schedule 03.04.2015    source источник


Ответы (4)


На данный момент кажется, что нет способов решить эту проблему, но я нашел обходной путь для разработчиков.

Если вы используете Chrome в качестве браузера, вы можете загрузить это расширение и включите его при попытке аутентификации. Тем не менее, я не думаю, что вы хотите просить пользователей загружать это расширение, так как это иногда вызывает проблемы с безопасностью, а его постоянное включение приведет к ошибкам при использовании других сайтов (попробуйте Google или Facebook, Google просто вылетит). веб-сайте, и Facebook подскажет вам что-то не так).

В результате вы можете попробовать другой тип потока. Поток кода, похоже, работает на других платформах, кроме браузера.

person Anoxic    schedule 18.10.2015

Вы должны иметь возможность отправлять аутентифицированные запросы с помощью CORS к API OneDrive после получения access_token. Судя по предоставленным заголовкам HTTP, вам нужно будет выполнить еще один вызов, чтобы выкупить код для токена доступа. Возможно, вы захотите увидеть http://onedrive.github.io/auth/msa_oauth.htm (шаг 2). После того, как вы получили токен доступа, вы захотите добавить токен доступа в заголовок «Авторизация» вашего запроса. Пример HTTP-запроса с использованием CORS и заголовка ответа ниже. Надеюсь, это поможет.

var xhr = new XMLHttpRequest();
var oauthAccessToken = accessTokenStoredHere();
xhr.open('GET',
  'https://api.onedrive.com/v1.0/drive/');
xhr.setRequestHeader('Authorization',
  'Bearer ' + oauthAccessToken);
xhr.send();

GET /v1.0/drive/ 
HTTP/1.1
Authorization:Bearer YOUR_ACCESS_TOKEN
Host:api.onedrive.com
X-Target-URI:https://api.onedrive.com
Connection:Keep-Alive
person Toan-Nguyen    schedule 06.04.2015
comment
Привет, Тоан, ошибка CORS возникает, когда я пытаюсь позвонить, чтобы выкупить токен. Я смог обойти это, заставив сервер сделать запрос токена. Проблема CORS остается в том, что браузер не может напрямую выкупить токен, потому что сервер токенов не возвращает заголовок Access-Control-Allow-Origin:. - person user1936097; 08.04.2015
comment
Я считаю, что API OneDrive поддерживает CORS, но не службу OAuth. - person Toan-Nguyen; 09.04.2015

Поток кода не поддерживается для CORS. Это довольно стандартная реализация OAuth 2. Поток маркеров предназначен для использования в одностраничных приложениях/сценариях, где необходим CORS, а поток маркеров работает с CORS.

Если ваше приложение работает дольше, чем 1 час действия токена доступа, вы можете использовать скрытый IFRAME для автоматической повторной аутентификации и получения нового токена доступа. Дополнительные сведения доступны на странице Сценарии аутентификации для Azure AD

person Ryan Gregg    schedule 15.09.2016

Из соображений безопасности браузеры будут блокировать запросы от источника, отличного от отправителя, за исключением случаев, когда ответственный за API разрешает запросы источника в возвращенном ответе обратного сервера. Конфигурация CORS выполняется только владельцем API (серверная часть), в данном случае это Microsoft; к сожалению, вы не можете изменить эту конфигурацию, кроме как заблокировав обнаружение CORS в браузерах, и это не идеальное решение, оно может создать угрозу безопасности и будет распространено на все приложения, доступ к которым осуществляется через этот перенастроенный браузер.

Вы должны выполнить запрос через свой сервер и обернуть его доступной ссылкой из вашего API.

person AbuDawood    schedule 26.02.2018