3

我試圖使用提取API從服務工作人員查詢Firebase數據庫。但它不能按預期工作,因爲我無法正確認證。通過在服務工作人員中提取操作驗證Firebase數據庫

基本上我想要做的是從原點https://myproject.firebaseapp.com服務工作者裏面我做這樣的呼籲:

var fetchOptions = {}; 
fetchOptions.credentials = 'include'; 
var url = options.messageUrl; 
var request = new Request('https://myproject.firebaseio.com/user/foobar.json', fetchOptions); 
messagePromise = fetch(request).then(function(response) { 
    return response.json(); 
}); 

我得到這個錯誤:

Fetch API cannot load https://myproject.firebaseio.com/user/foobar.json. Response to preflight request doesn't pass access control check: Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''. It must be 'true' to allow credentials. Origin 'https://myproject.firebaseapp.com' is therefore not allowed access. 

任何想法一種方法來解決它?如何從SW中查詢/更新Firebase數據庫?

我讀過https://jakearchibald.com/2014/using-serviceworker-today/,其中一個問題就是這個問題,Fetch請求不發送認證。

理想情況下,能夠在SW內部使用Firebase JS API會很好,但這似乎並不奏效。

回答

2

Firebase不會將身份驗證信息存儲爲Cookie,也不會將其存儲在憑據中發送的任何內容中,因此無需在您的提取請求中發送它們。相反,你需要從火力地堡驗證拉令牌:

firebase.auth().currentUser.getToken(true).then(function(token) { 
    // token is the value you'll need to remember for later 
}); 

一旦你得到了令牌,你應該能夠把它作爲查詢參數例如添加到REST請求?auth={THE_TOKEN}。這將允許您在服務人員中進行已驗證的請求。

+0

感謝您的回答,我做了您的建議,並可以成功檢索令牌,然後將其傳遞給SW,並可以成功將其存儲以供查詢。但是,當我用?token = {the_token}查詢URL時,我得到一個權限被拒絕的答案。事實上,具有相同URL和令牌的curl將返回相同的結果。我失蹤的東西?請注意,應用程序的其餘部分可以使用PolymerFire元素很好地查詢Firebase數據庫(並且我已成功登錄) –

+0

糟糕!這就是我得到的不利用文檔刷新自己。 param實際上是'?auth ='not'?token ='。請參閱[文檔](https://firebase.google.com/docs/database/rest/retrieve-data#section-rest-reading-data-get)以獲取更多有用的信息。 –