我有一个 Firebase 函数,需要按照 https://stackoverflow.com/a/44500591/82156:
进行身份验证exports.listBooksNeedingSync = functions.https.onRequest(async (req, res) => {
const tokenId = req.get('Authorization')?.split('Bearer ')[1] || '';
await admin.auth().verifyIdToken(tokenId);
...
我想从 chrome 扩展程序调用此函数。我按照 https://firebase.google.com/docs/auth/web/chrome-extension 创建了一个
firebaseAuth()
函数,该函数使用离线文档/ iframe 让用户通过 google 登录。当我从我的 Service Worker 调用该函数时,身份验证信息已成功返回。
但是,当我调用 firebase 函数时,不会自动设置授权标头:
import { getFunctions, httpsCallable } from "firebase/functions";
const functions = getFunctions();
const foobar = httpsCallable(functions, 'foobar');
...
const auth = await firebaseAuth();
const token = auth['_tokenResponse']?.idToken;
console.log('token: ', token); // succcess
await foobar(); // unauthenticated
如果我手动卷曲请求并将
-H "Authorization: Bearer <token>
设置为我上面收到的令牌,则卷曲请求工作正常,因此我知道令牌正在工作。
我读过的所有内容都说 firebase sdk 应该自动知道它已经过身份验证并传递适当的标头,但事实并非如此,我认为因为身份验证实际上发生在屏幕外 iframe 中,而不是在服务工作线程本身中。
如何告诉 firebase 在进行 httpsCallable 调用时使用从
firebaseAuth()
收到的身份验证令牌?
道格是正确的。将我的 firebase 函数更改为以下内容(并对我使用请求对象的方式进行相关更改)解决了问题:
exports.foobar = onCall(async (request) => { ... }