Service Worker から Web サービスを取得しようとしています。このサービスは基本的な Apache 認証で保護された JSP であるため、要求ヘッダーで認証するための資格情報を提供する必要があります。次のリクエストは、メイン ウィンドウから正常に機能します。
self.addEventListener('push', function(event) {
console.log('Received a push message', event);
event.waitUntil(
fetch(ONLINE_SITE_ENDPOINT, {
method: 'GET',
mode: 'cors',
headers: {
'Accept': 'application/json',
'Authorization': 'Basic btoa(auth info)'
}
}).then(function(response) {
//process response
}).catch(function(err) {
})
);
});
そのコードは event.waitUntil() スコープ、つまり「プッシュ」イベント リスナーから呼び出される関数です。ただし、まったく同じ呼び出しが 401 (Unauthorized) で失敗します。開発者ツールの [ネットワーク] パネルは、ヘッダーが送信されていないことを示しています。
OPTIONS /latest-new.jsp HTTP/1.1
Host: {an accessible host}
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
Access-Control-Request-Headers: accept, authorization
Accept: */*
Referer: http://localhost/service-worker.js
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
ここに何か欠けていますか?それとも Service Worker からは達成できないのでしょうか?
追加情報: Service Worker スコープで「定義されていない」ため、XMLHttpRequest を使用できません。JSON を取得する前の JSP のヘッダー:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
更新:セキュリティで保護されていない URL への要求は失敗しないため、Service Worker からの認証ヘッダーには間違いなく何かがあります。Apache 認証なしの同じサービスは、期待どおりに機能します。