在Chrome扩展程序背景页面中使用Firebase身份验证

5
我该如何在Chrome扩展中使用Firebase进行身份验证?我需要在Forge中指定允许的域名列表。Chrome扩展的域名只是一个类似哈希值的字符串。
我已经阅读了这篇文章:authClient.login problems,但是Firebase Forge不接受基于哈希的Chrome扩展域名。是否有其他方法可以解决?目前我只是读取cookie firebaseSessionKey 来假定我已登录。但这肯定不像让Firebase验证此会话密钥那样安全。

Firebase的工程师在此。由于Chrome扩展允许更广泛地修改HTTP请求,因此在此配置不同的引用页可能不是安全的解决方案。如果您有机会,我想听听您的用例以及您想在扩展中使用哪种类型的身份验证 - 随时通过电子邮件与我联系:rob@firebase.com - Rob DiMarco
我会给你们写一篇关于这个的文章。在我开发这个系统的过程中,我已经做了很长的笔记。目前该系统已经有了三个不同平台的代码,并将扩展到大约12个平台。我认为你们可能会觉得很有趣。 - Nandeep Mali
2个回答

8
正如Rob所指出的那样,在不强制执行来源限制的环境中,认证是无法运作的。这里的根本问题在于任何身份验证提供者(Facebook、Twitter、Persona或您自己的服务)都无法向浏览器发放身份 - 也就是说,使用Facebook登录到您的浏览器(或扩展程序)是没有意义的。

Firefox的F1插件遇到了类似的问题(http://f1.mozillamessaging.com/),您可以授权F1代表您在twitter/facebook上发布内容。该扩展还有一个网站,您可以在其中提供登录页面,并像通常在Web页面中一样进行操作。您需要一些代码来在Web页面和扩展之间进行通信,Chrome提供了必要的工具。

我建议采用同样的方法-在真实域上创建一个网页(Github pages非常适合此类情况),以与您的扩展配套使用。这意味着您的扩展无法脱机工作,但是您的登录或写入Firebase也无法脱机!


我有一个带有仪表板的网站,用户可以登录并通过一些与Firebase直接链接的设置来维护帐户(因此设置将反映在各处!)。这最终是我计划采取的措施,以确保Chrome扩展能够在某种授权环境中工作。正如我在回复Rob的评论中所写的,我希望这可以在各种平台上运行。 - Nandeep Mali
@Anant,网页必须向扩展传递哪种类型的信息?登录后,用户变量具有用户对象,但即使我们将其传递给扩展程序,Firebase仍然会认为用户未登录。 - abinop
3
嗨 @abinop,你需要将 Firebase 认证令牌从网页传回扩展程序。你可以通过 user.firebaseAuthToken 访问它,然后使用 firebaseRef.auth(token) 作为该用户登录。 - Anant
@Anant,我正在努力完成这个任务。有没有教程或示例可以教我如何与扩展程序交互?我刚刚开始接触扩展程序。 - kirtan403

2
这将使用 Google Plus 登录流程来工作,我相信这是唯一允许跨认证的流程,因此范围是 Google Plus 登录。

"www[dot]googleapis[dot]com/auth/plus.login"

所以这里发生的是,您将从扩展程序获取access_token,并使用authwihtoauthtoken指定Google作为提供程序,以及使用chrome.identity.getAuthToken()获取的access_token将其与请求一起发送到Firebase!

https://www.firebase.com/docs/web/api/firebase/authwithoauthtoken.html

事实是,此访问令牌可以由任何其他应用程序发行,因此我们需要确保它是有效的并已为我们的应用程序发行。基本上,我们需要知道是否有中间人试图访问我们的数据库。
这种验证是由Firebase进行的。
他们将检查此令牌是否属于与令牌发出的应用程序相同的应用程序。
因此,您需要在Google开发人员控制台下为您的扩展创建另一组凭据。我们基本上将执行与为网页执行相同的操作,但我们将在Firebase的安全部分中插入此新的凭据组以使用Firebase的Google OAuth进行验证。
他们将在那里为我们进行此检查。他们将与Google验证该令牌是否发行给相同的应用程序。
就是这样。
背景信息。

https://developers.google.com/identity/protocols/OAuth2UserAgent#validatetoken

用例

在需要进行身份验证的请求中发送 ID 令牌。例如,如果您需要将数据传递到服务器,并且想要确保特定数据来自特定用户。

何时验证访问权限 除非您知道它们直接来自 Google,否则所有令牌都需要在您的服务器上进行验证。您从客户端应用程序接收到的任何令牌都必须经过验证。

Google 在以下网址提供了 Python 教程:

"github[点]com/googleplus/gplus-verifytoken-python"

因此,基本上发生的情况是:当您在 Firebase 中输入 CLIENT_ID 和 APP_SECRET 并启用 Google 身份验证时,Firebase 会为您执行此验证,而不是您在服务器上执行验证。

正确的做法是结合或使用相同的方式验证 client_secret 发行给了谁。Chrome 将为您提供 access_token,然后在 Firebase 的后端上检查此 access_token。


谢谢您对此的回复!虽然已经有一段时间了,但我会尝试一些方法并回来。 :) - Nandeep Mali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接