【发布时间】:2019-02-11 16:11:46
【问题描述】:
我正在为我的公司设置 PWA 以供内部使用。我应该使用什么方法将不记名令牌附加到来自 dom 或 web-worker 的所有请求。
我使用的这种方法在发布 form 或 json 时按预期工作,但我想要一种更简洁或更友好的方法,因为我不相信 text 后备就足够了。
我在 Google 的 workbox.js 服务工作者模块中寻找一个函数,看看我是否可以设置一个拦截,以便在向我的服务器发出请求时始终附加承载令牌,因为这将解决我最终的问题这里是第一位的。此代码基于Firebase Service Worker setup。并且没有任何东西可以获取并将发布数据重新添加到新请求中,从而有效地删除了整个 POST 正文。
这是我最终得到的代码。
self.addEventListener( 'fetch', ( event ) => {
const requestProcessor = async ( idToken ) => {
let req = event.request;
// For same origin https requests, append idToken to header.
if ( self.location.origin == getOriginFromUrl( event.request.url ) &&
( self.location.protocol == 'https:' ||
self.location.hostname == 'localhost' ) &&
idToken ) {
let contentType = req.headers.get( "Content-Type" );
// Clone headers as request headers are immutable.
const headers = new Headers();
for ( let entry of req.headers.entries() ) {
headers.append( entry[ 0 ], entry[ 1 ] );
}
// Add ID token to header.
headers.append( 'Authorization', 'Bearer ' + idToken );
try {
let tmpReq = req.clone();
let body = "";
if ( req.body ) {
body = req.body;
} else if ( req.method === "POST" ) {
// get the post data if its json
if ( contentType === "application/json" ) {
// get JSON data
let json = await tmpReq.json();
body = JSON.stringify( json );
// Get the post data if its a submitted form
} else if ( contentType === "application/x-www-form-urlencoded" ) {
// get Form-Data
body = await tmpReq.formData();
// Get the post data as plain text as a fallback
} else {
body = await tmpReq.text();
}
console.log( "Content", content );
}
// create a new request with the Bearer Token and post body
req = new Request( req.url, {
method: req.method,
headers: headers,
mode: 'same-origin',
credentials: req.credentials,
cache: req.cache,
redirect: req.redirect,
referrer: req.referrer,
body: body,
bodyUsed: req.bodyUsed,
context: req.context
} );
} catch ( e ) {
// This will fail for CORS requests. We just continue with the
// fetch caching logic below and do not pass the ID token.
}
}
return fetch( req );
};
// Fetch the resource after checking for the ID token.
// This can also be integrated with existing logic to serve cached files
// in offline mode.
event.respondWith( getIdToken().then( requestProcessor, requestProcessor ) );
} );
总而言之,我的问题是...... 当 POST 的 contentType 既不是 JSON 或 FormData 覆盖所有角度时,我添加的 text() 后备是什么,还是我应该考虑一种新的方法传输 POST 正文。
【问题讨论】:
标签: javascript firebase-authentication service-worker progressive-web-apps workbox