从 Chrome 扩展调用经过身份验证的 Firebase 函数

问题描述 投票:0回答:1

我有一个 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()
收到的身份验证令牌?

javascript firebase google-chrome-extension firebase-authentication google-cloud-functions
1个回答
0
投票

道格是正确的。将我的 firebase 函数更改为以下内容(并对我使用请求对象的方式进行相关更改)解决了问题:

exports.foobar = onCall(async (request) => { ... }
© www.soinside.com 2019 - 2024. All rights reserved.