3

Ich versuche, eine Firebase-Datenbank von einem Service Worker mithilfe der Fetch-API abzufragen. Es funktioniert jedoch nicht wie erwartet, da ich nicht richtig authentifiziert werden kann.Behandeln der Authentifizierung mit Firebase-Datenbank mit Fetch in einem Service Worker

Im Grunde, was ich versuche zu tun, vom Ursprung https://myproject.firebaseapp.com in einem Service-Worker ich einen Anruf wie folgt tun:

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(); 
}); 

ich diesen Fehler:

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. 

Jede Idee einer Möglichkeit, es zu beheben? Wie sollte man die Firebase-Datenbank von einer SW abfragen/aktualisieren?

Ich habe gelesen https://jakearchibald.com/2014/using-serviceworker-today/ und einer der Gotcha war genau dieses Problem, die Tatsache, dass Fetch-Anfrage keine Authentifizierung senden.

Idealerweise wäre es großartig, die Firebase JS API in einer SW verwenden zu können, aber das scheint nicht so gut zu funktionieren.

Antwort

2

Firebase speichert die Authentifizierungsinformationen nicht als Cookie oder in irgendetwas, das in den Anmeldeinformationen mitgeschickt wird, sodass Sie diese nicht in Ihrer Abrufanforderung senden müssen. Stattdessen müssen Sie die Token von Firebase Auth ziehen:

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

Sobald Sie den Code haben, sollten Sie in der Lage sein, es als Abfrageparameter an die REST-Anforderung anzu z.B. ?auth={THE_TOKEN}. Dadurch können Sie Ihre authentifizierte Anforderung im Service Worker vornehmen.

+0

Danke für die Antwort, ich habe getan, was Sie vorgeschlagen und konnte das Token erfolgreich abrufen, dann habe ich es an die SW übergeben und konnte es erfolgreich für meine Abfragen speichern. Wenn ich jedoch die URL mit "token = {the_token}" abfrage, erhalte ich eine Antwort auf eine verweigerte Antwort. In der Tat ein curl mit der gleichen URL und das Token gibt das gleiche Ergebnis zurück. Etwas, das ich vermisse? Beachten Sie, dass der Rest der App die Firebase-Datenbank problemlos mit PolymerFire-Elementen abfragen kann (und ich bin erfolgreich angemeldet) –

+0

Hoppla! Das ist, was ich bekomme, um mich nicht mit den Dokumenten zu erfrischen. Der Parameter ist eigentlich '? Auth =' nicht '? Token ='. Weitere hilfreiche Informationen finden Sie unter [docs] (https://firebase.google.com/docs/database/rest/retrieve-data#section-rest-reading-data-get). –

Verwandte Themen