【问题标题】:How to use firebase database in chrome extension如何在 chrome 扩展中使用 firebase 数据库
【发布时间】:2019-01-06 05:47:10
【问题描述】:

我想将它用作我的内容脚本的一部分,以便我可以从我的 firebase 数据库中获取数据。但是,我不知道如何引用 firebase 文档中给出的脚本:

<script src="https://www.gstatic.com/firebasejs/5.3.0/firebase.js"></script>

我知道如果我在弹出的html页面中进行所有操作,那么我可以加载脚本标签,但是在内容脚本中,除了内容页面之外没有html页面,所以我不确定是否这甚至是可能的。

【问题讨论】:

  • 您必须下载脚本并将其与您的扩展程序捆绑在一起。或者,您可以允许在 manifest.json 中下载 SDK。见github.com/firebase/quickstart-js/tree/master/auth/…
  • @FrankvanPuffelen 我没有使用身份验证。只是数据库,所以我不确定该链接是否仍然有效?
  • @FrankvanPuffelen 所以显然,我必须将扩展程序上传到商店才能真正让它工作?我只是这样做了,但这有必要吗?
  • @FrankvanPuffelen 按照说明进行操作,但没有成功。
  • @Khalil Hijazi 你有没有想过这个问题?

标签: javascript google-chrome firebase firebase-realtime-database google-chrome-extension


【解决方案1】:

ContentScript 运行在页面的 DOM 上,但运行在不同的 JS 沙箱上,所以不能像示例中那样直接通过 DOM 注入 JS。

我建议您将 firebase lib 加载到后台页面,然后您可以通过后台后端从后台脚本和来自内容脚本的代理请求访问它。这不会导致每次加载页面加载内容脚本时都加载firebase lib,并且它将在后台页面初始化时加载一次(或者您可以使用非持久性后台脚本通过请求加载它)。

例子:

ma​​nifest.json

{
    "manifest_version": 2,
    "name": "FireBase Demo",
    "description": "FireBase client demo",    
    "version": "0.0.1",
    "permissions": [
        "<all_urls>",
        "tabs"
    ],
     "background": {
       "page": "bg.html",
       "persistent": false
     },
     "content_scripts": [{
        "matches": ["https://*/*","http://*/*"],
        "js": ["cs.js"]
    }],
     "content_security_policy": "script-src 'self' https://www.gstatic.com/firebasejs/5.3.0/firebase.js; object-src 'self'"
}

bg.html

<html>
    <head>
        <script src="https://www.gstatic.com/firebasejs/5.3.0/firebase.js"></script>
        <script src="bg.js"></script>
    </head>
    <body></body>
</html>

bg.js

firebase.initializeApp({
  apiKey: '...',
  authDomain: '...',
  projectId: '...'
});

var db = firebase.firestore();
db.settings({timestampsInSnapshots: true});
  chrome.runtime.onMessage.addListener((msg, sender, response) => {
    if (msg.command == "add"){
      console.log("process msg add", msg, sender, response);
      db.collection(msg.collection).add(msg.data).then((result) => {
        console.log("success", result)
        response({type: "result", status: "success", data: result, request: msg});
      }).catch((result) => {
        console.log("error", result);
        response({type: "result", status: "error", data: result, request: msg}); 
      });
    }
    return true;
  });

cs.js

chrome.runtime.sendMessage({command: "add", collection: "users", data: {name: "user"}}, (msg) => {
  console.log("response", msg)
});

另一个变体是加载你的 firebase JS lib 和你需要运行到页面的 JS 沙箱的代码,方法是将其注入页面的 DOM,如下所示:

var script = document.createElement("script");
script.src = "https://www.gstatic.com/firebasejs/5.3.0/firebase.js"
document.body.append(script); // firebase lib will be loaded to the page's JS sandbox and page's DOM
var fn = function injectedFunction(seed) { /* your JS code you want to run is page's sandbox */ }
var ele = document.createElement("script");
ele.textContent = fn+"console.log(injectedFunction());";

但是这个变种很糟糕,因为在这种情况下页面的 CSP 可能会阻塞你的 JS。 document.body.appendChild(ele);

【讨论】:

    【解决方案2】:

    将以下内容添加到您的扩展清单文件中应该可以解决问题:

    "permissions": [
        "https://www.gstatic.com/firebasejs/5.3.0/firebase.js"
    ],
    

    完成此操作后,您应该能够使用任何普通 XHR 客户端从您的扩展 javascript 访问 API(请注意任何安全问题)。

    【讨论】:

    • 你是建议他专门使用那个网站吗?这是什么?
    • @jkupczak 不,对不起,我忘了我会在几秒钟内更改它。
    • @jkupczak 已修复
    • @Kenzoid 感谢您的建议,我会尽快查看它是否可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2018-02-01
    • 2017-10-15
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多