我正在尝试使用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会很棒,但这似乎也不行。
答案 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}
。这将允许您在服务工作者中进行经过身份验证的请求。