42 lines
1.1 KiB
JavaScript
42 lines
1.1 KiB
JavaScript
const CACHE = 'v1';
|
||||
|
|
const LOGIN = '/login.html';
|
|||
|
|
|
|||
|
|
self.addEventListener('install', () => self.skipWaiting());
|
|||
|
|
|
|||
|
|
self.addEventListener('activate', e => e.waitUntil(self.clients.claim()));
|
|||
|
|
|
|||
|
|
self.addEventListener('fetch', e => {
|
|||
|
|
const req = e.request;
|
|||
|
|
if (req.url.includes('/login.html') || req.url.includes('/auth/')) {
|
|||
|
|
e.respondWith(fetch(req));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
e.respondWith((async () => {
|
|||
|
|
const token = self.__auth_token;
|
|||
|
|
if (!token) {
|
|||
|
|
// 尝试从 IndexedDB/localStorage 读取(SW 中无法直接访问 localStorage)
|
|||
|
|
// 依赖客户端页面消息传递 token
|
|||
|
|
return fetch(req);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const headers = new Headers(req.headers);
|
|||
|
|
headers.set('Authorization', 'Basic ' + token);
|
|||
|
|
const res = await fetch(new Request(req, { headers }));
|
|||
|
|
|
|||
|
|
if (res.status === 401) {
|
|||
|
|
return Response.redirect(LOGIN, 302);
|
|||
|
|
}
|
|||
|
|
return res;
|
|||
|
|
})());
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 接收页面发来的 token
|
|||
|
|
self.addEventListener('message', e => {
|
|||
|
|
if (e.data && e.data.type === 'SET_TOKEN') {
|
|||
|
|
self.__auth_token = e.data.token;
|
|||
|
|
}
|
|||
|
|
if (e.data && e.data.type === 'CLEAR_TOKEN') {
|
|||
|
|
self.__auth_token = null;
|
|||
|
|
}
|
|||
|
|
});
|