将 Google API Javascript 客户端库加载到 Chrome 扩展程序中

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18681803/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-27 12:52:22  来源:igfitidea点击:

Loading Google API Javascript Client Library into Chrome Extension

javascriptgoogle-chrome-extensiongoogle-api-java-client

提问by woojoo666

I've been trying to wed the google api javascript client library with a chrome extension for a while now, but it seems the chrome extension has a terrible case of cold feet. The link to the script is

一段时间以来,我一直试图将 google api javascript 客户端库与 chrome 扩展程序结合起来,但似乎 chrome 扩展程序有一个可怕的冷脚案例。脚本的链接是

https://apis.google.com/js/client.js

https://apis.google.com/js/client.js

Downloading the files is messy because the script actually loads other scripts. I've tried including it in the manifest

下载文件很麻烦,因为脚本实际上加载了其他脚本。我试过将它包含在清单中

manifest.json (excerpt)

manifest.json(摘录)

"background": {
  "scripts": [
    "background.js",
    "https://apis.google.com/js/client.js?onload=callbackFunction"
  ]
},

but then the extension doesn't load. I've also tried injecting the script into the background html

但随后扩展不会加载。我也试过将脚本注入后台 html

background.js (excerpt)

background.js(摘录)

 var body = document.getElementsByTagName('body')[0];
 var script = document.createElement('script');
 script.type = 'text/javascript';
 script.src = "https://apis.google.com/js/client.js?onload=callbackFunction";

 body.appendChild(script);

but the chrome debugger gives me

但是 chrome 调试器给了我

Refused to load the script 'https://apis.google.com/js/client.js' because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:".

Refused to load the script 'https://apis.google.com/js/client.js' because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:".

Any ideas, or are they fated to be kept apart?

有什么想法,还是注定要分开?

Edit: note that you must add "?onload=myCallbackFunction" to the script url if you want to utilize a callback function. Thanks Ilya. More info here

编辑:请注意,如果您想使用回调函数,则必须将“?onload=myCallbackFunction”添加到脚本 url 中。谢谢伊利亚。更多信息在这里

回答by woojoo666

So far the only solution I've found is to first inject the script into the background html page like I did:

到目前为止,我找到的唯一解决方案是像我一样首先将脚本注入后台 html 页面:

background.js (excerpt)

background.js(摘录)

 var head = document.getElementsByTagName('head')[0];
 var script = document.createElement('script');
 script.type = 'text/javascript';
 script.src = "https://apis.google.com/js/client.js?onload=callbackFunction";
 head.appendChild(script);

And then to bypass the security warning, edit the manifest file (source):

然后绕过安全警告,编辑清单文件():

manifest.json (excerpt)

manifest.json(摘录)

"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'"

However, note that bypassing the security only works for httpslinks, and I also find it kind of hacky...any other solutions are welcome

但是,请注意,绕过安全性仅适用于https链接,而且我也觉得它有点麻烦……欢迎使用任何其他解决方案

回答by MrOrz

I found something interesting in the source code of https://apis.google.com/js/client.js. It reads:

我在源代码中发现了一些有趣的东西https://apis.google.com/js/client.js。它写道:

gapi.load("client",{callback:window["gapi_onload"], ......

gapi.loadis invoked as soon as client.jsis loaded in the webpage. It seems like window.gapi_onloadwill be invoked as a callback once gapi.clientis loaded.

gapi.loadclient.js在网页中加载后立即调用。window.gapi_onload一旦gapi.client加载,似乎将作为回调被调用。

As a proof of concept, I built this plunker: http://plnkr.co/edit/TGvzI9SMKwGM6KnFSs7U

作为概念证明,我构建了这个 plunker:http://plnkr.co/edit/TGvzI9SMKwGM6KnFSs7U

Both gapi.authand gapi.clientare successfully printed to console.

gapi.authgapi.client被成功地打印到控制台。



Back to Chrome extensions.

回到 Chrome 扩展程序。

I put this in the background section of my mainfest.json:

我把它放在我的背景部分mainfest.json

"background": {
  "scripts": [
    "background.js",
    "gapi-client.js"
  ]
}

in which background.jsis the main background script in my extension. All content of gapi-client.jsis directly copy-and-pasted from https://apis.google.com/js/client.js.

其中background.js是我的扩展程序中的主要后台脚本。的所有内容gapi-client.js直接从https://apis.google.com/js/client.js.

Inside background.jsit reads:

里面background.js写着:

window.gapi_onload = function(){
  console.log('gapi loaded.', gapi.auth, gapi.client);

  // Do things you want with gapi.auth and gapi.client.
}

Please note that background.jsis loaded prior to gapi-client.js. Because gapi-client.jsreads window["gapi_onload"]as soon as it's loaded, window.gapi_onloadmust be specified before that.

请注意,background.js加载之前gapi-client.js。因为加载后立即gapi-client.js读取window["gapi_onload"],因此window.gapi_onload必须在此之前指定。

As a result window.gapi_onloadis invoked as expected, with both gapi.authand gapi.clientpopulated.

结果window.gapi_onload是按预期调用,同时填充了gapi.authgapi.client

In my solution I did not create a background.htmlon my own. I did not modify the content security policy either. However, notice that the solution is rather undocumented, thus is subject to change in the future.

在我的解决方案中,我没有background.html自己创建一个。我也没有修改内容安全策略。但是,请注意,该解决方案相当无证,因此将来可能会发生变化。

回答by goodhyun

You can load them via background.html which loads your background.js.

您可以通过加载 background.js 的 background.html 加载它们。

<html>
 <head>
  <title></title>
  <script src="background.js"></script>
 </head>
 <body>
 </body>
 <script src="https://apis.google.com/js/client.js"></script>
</html>

with manifest.json:

使用 manifest.json:

"background":
{
 "page": "background.html"     
}, 
"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'",

回答by Ilya Dzivinskyi

You just need set the onload method for this library

您只需要为此库设置 onload 方法

https://apis.google.com/js/client.js?onload=handleClientLoad

https://apis.google.com/js/client.js?onload=handleClientLoad

and handleClientLoad - default your registration method.

和 handleClientLoad - 默认您的注册方法。

Sample for js oauth

js oauth 示例

回答by zhonglin

I tried to add the manifest file as woojoo666's suggestion, but it still failed, It looks we need to add one more flag 'unsafe-eval':

我尝试将清单文件添加为 woojoo666 的建议,但仍然失败,看来我们需要再添加一个标志“unsafe-eval”:

"content_security_policy": "script-src 'self' 'unsafe-eval' https://apis.google.com; object-src 'self'",

"content_security_policy": "script-src 'self' 'unsafe-eval' https://apis.google.com; object-src 'self'",