XMLHttpRequest преуспевает без явных разрешений? Может быть, CORS?

Я разработал расширения Google Chrome, в которых используется API данных YouTube v2. Мое поле разрешений в манифесте выглядит так, потому что script вводится на страницах под youtube.com, и мне также нужен доступ к вкладкам:

"permissions": ["tabs", "*://*.youtube.com/*"]

Это также работает, когда я делаю запрос к API данных YouTube v2, потому что запрос выполняется http://gdata.youtube.com/, так что это тот же домен. Но теперь я перехожу к API данных YouTube v3, и запросы должны быть выполнены в http://www.googleapis.com/youtube/v3/ (примечание HTTPS вместо HTTP). Однако, как ни удивительно, мои запросы работают отлично, не добавляя никаких новых разрешений.

Я знаю, я задаю вопрос, который не кажется проблемой, но лично я считаю любое поведение, которое я не понимаю в своем программном обеспечении. Почему это происходит? Я не должен добавлять разрешение, например "*://*.googleapis.com/*", чтобы мои запросы XMLHttpRequest к API работали?

У меня также есть некоторый король предположения: заголовки HTTP Access Control. Мои запросы отправляют заголовок Origin со значением chrome-extension://myExtensionId. И ответ API также содержит следующий заголовок:

Access-Control-Allow-Origin: chrome-extension://myExtensionId

Но может ли это быть причиной того, что Chrome позволяет мне выполнять XMLHttpRequest с перекрестным происхождением без какого-либо дополнительного разрешения, определенного в манифесте? Не уверен, и, по-видимому, это не документировано нигде в API Google API, документации по API-интерфейсам данных YouTube версии 3 или расширении Chrome.

Ответ 1

Если Chrome не находит разрешения в манифесте, он обрабатывает запрос как обычный запрос. Это означает, что запрос будет по-прежнему успешным, если установлены правильные заголовки CORS. В противном случае запрос будет терпеть неудачу из-за той же политики происхождения.

Библиотека JavaScript API Google явно упоминает поддержку CORS:

Выполнение запроса: вариант 3
API Google поддерживают CORS. Посетите страницу CORS для получения дополнительной информации об использовании CORS для выполнения запросов.

Если это возможно, я по-прежнему рекомендую добавить разрешение в файл манифеста. Для простых запросов это не приносит никаких преимуществ. Для непростых запросов это будет половину количества запросов: непростым запросам всегда предшествует запрос preflight (OPTIONS), который проверяет, разрешен ли клиенту доступ к источнику.

Добавив разрешение на файл манифеста, Chrome не вернется в CORS и всегда будет использовать один сетевой запрос для завершения запроса. Отлично!
Однако... вы можете подумать еще раз, если вы являетесь автором уже развернутого расширения. Когда в файл манифеста добавляются новые разрешения для источника, расширение будет отключено до тех пор, пока пользователь не утвердит расширение. Диалоговое окно показывает "Удалить расширение" и "Включить" рядом друг с другом, поэтому есть шанс потерять пользователя.

Если вы хотите, вы можете преодолеть эту проблему, используя необязательное разрешение, активированное на странице параметров. Четко объясните на языке непрофессионала, что этот вариант улучшит скорость расширения и не забудьте указать, что потребуются дополнительные разрешения.