3

Fetch APIを使用してサービスワーカーからFirebaseデータベースを照会しようとしています。しかし、私は正しく認証されないため、期待どおりに動作しません。私はこのエラーをサービスワーカーでフェッチを使用してFirebaseデータベースへの認証を処理する

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. 

任意のアイデア

基本的に私は何をしようとしているが、私はこのような呼び出しをします、原点https://myproject.firebaseapp.comからサービス労働者の中にありますそれを修正する方法の? SWからFirebaseデータベースを照会/更新するにはどうすればよいですか?

私はhttps://jakearchibald.com/2014/using-serviceworker-today/を読みましたが、そのうちの1つはまさにその問題でした。フェッチ要求が認証を送信しないという事実です。

SW内でFirebase JS APIを使用できるのが理想的ですが、これはうまく機能していないようです。

答えて

2

Firebaseは、認証情報をクッキーとして、または資格情報に送信されるものに格納しないので、フェッチ要求でそれらを送信する必要はありません。代わりに、あなたはFirebase認証からトークンをプルする必要があります:

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を持つカールとトークンは同じ結果を返します。何かが足りない?アプリケーションの残りの部分は、PolymerFire要素を使用してfirebaseデータベースをクエリできます(と私は正常にログインしました)。 –

+0

おっと!それは私がドキュメントで自分自身をリフレッシュしないために得るものです。 paramは実際には '?auth =' not '?token ='です。詳細については、[the docs](https://firebase.google.com/docs/database/rest/retrieve-data#section-rest-reading-data-get)を参照してください。 –

関連する問題