我正在尝试使用Firebase对Chrome扩展(manifest v3(的后台脚本(服务工作者(中的用户进行身份验证。我使用signInWithCredential
方法并传递一个idToken(下面的信息(,但这会返回以下错误:
error: id token is not issued by Google. (auth/invalid-credential).
我的身份验证流是这样的:
- 用户点击";登录";按钮
- Chrome扩展打开了一个新的选项卡,并重定向到我的网络应用程序(在线(,用户可以通过Firebase(通过Google OAuth或电子邮件/密码组合(登录到他们的帐户
- 一旦用户在网站上进行了身份验证,就会从具有
currenUser.getIdToken()
的客户端生成一个idToken。就像这样:
auth.currentUser.getIdToken(true).then((idToken) => {
// saves the token to be used later
return idToken
})
- 然后,网站将生成的idToken发送到带有
window.chrome.runtime.sendMessage(...)
的chrome扩展 - Chrome扩展接收idToken(在此之前一切正常(,并尝试使用
signInWithCredential
登录。此处显示上面提到的错误
更多注意事项:
- 我检查了chrome扩展和托管网页是否连接到Firebase中的同一项目
- 我需要验证之前使用Google OAuth或电子邮件/密码组合注册的用户,因此我不能使用其他地方提到的
chrome.identity
API
有关于如何解决这个问题的建议吗?
我如何才能实现我想要做的事情?
非常感谢!
我今天刚刚在做这个。我发现两件事对我有效,不确定它们是否是最简单的解决方案,但它们有效:
- 不要在步骤3中使用getIdToken,而是在用户通过身份验证后,调用一个使用createCustomToken生成令牌的云函数,然后立即将其传递回客户端并转发到扩展。以下是更多信息:https://firebase.google.com/docs/auth/admin/create-custom-tokens
- 身份验证模拟器拒绝该令牌,但如果您部署云功能,则它可以工作
如果您想了解更多细节,请告诉我。同样,我不喜欢这个解决方案,因为当网站上的auth更改时,您必须继续发送扩展消息。但除非有人有更好的主意,否则我只能找到/解决。