如何在 Electron/Firebase 应用中支持 HTTP 协议

Posted

技术标签:

【中文标题】如何在 Electron/Firebase 应用中支持 HTTP 协议【英文标题】:How to support HTTP protocol in Electron/Firebase App 【发布时间】:2020-08-15 21:43:53 【问题描述】:

我正在尝试在我的 Electron 应用中使用 Firebase 身份验证 (saml)。我读过 Electron 不是“官方支持的”,但是我也遇到了一些线程表明人们已经让它工作了。我的问题是使用firebase.auth().signInWithRedirect(或signInWithPopup)时出现错误:

 code: "auth/operation-not-supported-in-this-environment"
 message: "This operation is not supported in the environment this application
 is running on. "location.protocol" must be http, https or chrome-extension and 
 web storage must be enabled."

Google 出现 this tips and tricks article,这表明只使用托管 URL:

第三,OAuth 请求需要有一个可验证的来源,可以在 Firebase 控制台中列入白名单。这要求当前的 Electron 浏览器窗口使用 http 或 https 协议,而不是文件。这意味着当前窗口内容应该使用 browserWindow.loadURL 而不是 browserWindow.loadFile 加载,并且 url 必须是 http 或 https url,而不是 file:// url。这通常需要一个托管页面,该页面包含在 Electron 窗口中。

这可能会起作用,因为只需使用以下方法在 Angular 开发服务器上本地运行应用程序即可:

mainWindow.loadURL('http://localhost:4200');

我不想这样做,因为拥有托管页面会大大降低拥有原生应用的吸引力。

我可以通过让本地 Node/Express 实例使用 get-port 在本地为应用程序提供服务来找到一个空闲端口来在那里运行应用程序来完成这项工作。我还没有真正看到任何例子表明这一点。关于让它工作的一些 *** 问题,但没有什么让我认为它是可接受的生产级解决方案。

本地 Express 服务器是否是规避此错误的可接受方式,还是目前有更好的解决方案?

注意:this answer 中推荐的 The package 不是由 Firebase 发布的,而且它看起来也不支持 SAML 身份验证。

【问题讨论】:

我认为使用服务器是要走的路。但如果您不喜欢该选项,您可以尝试使用location.protocol = 'http:' 在您的页面上手动设置location.protocol。不确定这是否有效,因为我以前从未这样做过。但值得一试 这是一个安全限制,不允许使用 file:// 和任何其他违反 SAML 策略的方法。绕过它几乎是不可能的。如果你做到了,它是一个安全漏洞,最终将在未来修复.. 那么为什么要冒险呢?谨慎的方法是托管一个为您的客户端执行 SAML 机制的服务器组件。 @Nirus 所以要明确一点,你支持本地节点服务器的想法吗?仅供参考,我在客户端使用 angular-firebase 进行 saml 身份验证;它不会发生在节点服务器上。 【参考方案1】:

我已经在我的应用程序中成功实现了 firebase 电子邮件版本,加载 .html 文件而不是从 url 加载页面更可行,因为用户可以通过发送虚假数据来利用 url。但是使用 oauth 是不可能的,firebase 创建 webapp 您可以创建一个 html 文件,它应该包含 api 密钥、主机 url 等并将其托管在本地 android 文件中://android_assets/filename.html 即使离线也可以正常工作我不知道正确关于 电子

【讨论】:

以上是关于如何在 Electron/Firebase 应用中支持 HTTP 协议的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的应用程序中接收共享内容?

如何在一个应用程序中打开另一个程序

如何在android中打开相机应用程序[重复]

如何在 FastAPI RealWorld 示例应用中应用事务逻辑?

如何在移动应用中更改颤振应用中的名称

如何在 UWP 的应用中打开另一个应用