使用服务工作者中的Fetch处理对Firebase数据库的身份验证

时间:2016-06-23 04:32:53

标签: firebase firebase-realtime-database firebase-authentication service-worker fetch-api

我正在尝试使用Fetch API从Service Worker查询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会很棒,但这似乎也不行。

1 个答案:

答案 0 :(得分:2)

Firebase不会将身份验证信息存储为Cookie或将在凭据中发送的任何内容存储,因此无需在获取请求中发送它们。相反,您需要从Firebase Auth中提取令牌:

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

获得令牌后,您应该能够将其作为查询参数添加到REST请求中,例如: ?auth={THE_TOKEN}。这将允许您在服务工作者中进行经过身份验证的请求。