signInWithCredential在Chrome扩展的身份验证流中返回错误(清单v3)



我正在尝试使用Firebase对Chrome扩展(manifest v3(的后台脚本(服务工作者(中的用户进行身份验证。我使用signInWithCredential方法并传递一个idToken(下面的信息(,但这会返回以下错误:

error: id token is not issued by Google. (auth/invalid-credential).

我的身份验证流是这样的:

  1. 用户点击";登录";按钮
  2. Chrome扩展打开了一个新的选项卡,并重定向到我的网络应用程序(在线(,用户可以通过Firebase(通过Google OAuth或电子邮件/密码组合(登录到他们的帐户
  3. 一旦用户在网站上进行了身份验证,就会从具有currenUser.getIdToken()的客户端生成一个idToken。就像这样:
auth.currentUser.getIdToken(true).then((idToken) => {
// saves the token to be used later
return idToken
})
  1. 然后,网站将生成的idToken发送到带有window.chrome.runtime.sendMessage(...)的chrome扩展
  2. Chrome扩展接收idToken(在此之前一切正常(,并尝试使用signInWithCredential登录。此处显示上面提到的错误

更多注意事项:

  1. 我检查了chrome扩展和托管网页是否连接到Firebase中的同一项目
  2. 我需要验证之前使用Google OAuth或电子邮件/密码组合注册的用户,因此我不能使用其他地方提到的chrome.identityAPI

有关于如何解决这个问题的建议吗?

我如何才能实现我想要做的事情?

非常感谢!

我今天刚刚在做这个。我发现两件事对我有效,不确定它们是否是最简单的解决方案,但它们有效:

  1. 不要在步骤3中使用getIdToken,而是在用户通过身份验证后,调用一个使用createCustomToken生成令牌的云函数,然后立即将其传递回客户端并转发到扩展。以下是更多信息:https://firebase.google.com/docs/auth/admin/create-custom-tokens
  2. 身份验证模拟器拒绝该令牌,但如果您部署云功能,则它可以工作

如果您想了解更多细节,请告诉我。同样,我不喜欢这个解决方案,因为当网站上的auth更改时,您必须继续发送扩展消息。但除非有人有更好的主意,否则我只能找到/解决。

最新更新