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

woo*_*666 31 javascript google-chrome-extension google-api-java-client

我一直在尝试与Chrome扩展程序结合谷歌api javascript客户端库一段时间了,但似乎Chrome扩展程序有一个可怕的冷脚情况.脚本的链接是

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

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

manifest.json(摘录)

"background": {
  "scripts": [
    "background.js",
    "https://apis.google.com/js/client.js?onload=callbackFunction"
  ]
},
Run Code Online (Sandbox Code Playgroud)

但然后扩展不加载.我也尝试将脚本注入后台html

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);
Run Code Online (Sandbox Code Playgroud)

但是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:".

任何想法,还是他们命中注定要分开?

编辑:请注意,如果要使用回调函数,必须将"?onload = myCallbackFunction"添加到脚本URL.谢谢伊利亚.更多信息在这里

woo*_*666 19

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

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);
Run Code Online (Sandbox Code Playgroud)

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

manifest.json(摘录)

"content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'"
Run Code Online (Sandbox Code Playgroud)

但请注意,绕过安全仅适用于https链接,我也觉得它有点hacky ...欢迎任何其他解决方案


小智 8

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

gapi.load("client",{callback:window["gapi_onload"], ......
Run Code Online (Sandbox Code Playgroud)

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

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

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


返回Chrome扩展程序.

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

"background": {
  "scripts": [
    "background.js",
    "gapi-client.js"
  ]
}
Run Code Online (Sandbox Code Playgroud)

其中background.js是我的扩展中的主要后台脚本.所有内容gapi-client.js都直接复制粘贴https://apis.google.com/js/client.js.

里面background.js写着:

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

  // Do things you want with gapi.auth and gapi.client.
}
Run Code Online (Sandbox Code Playgroud)

请注意,background.js在之前加载gapi-client.js.因为一旦加载gapi-client.js就读window["gapi_onload"],window.gapi_onload必须在此之前指定.

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

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

  • 当我在清单中包含gapi-client.js时,它会尝试在background.html源代码中包含来自apis.google.com的第三个外部脚本.你有没有看到这个?因为它对我来说实际上是同样的错误.以下是该脚本的完整网址:https://apis.google.com/_/scs/apps-static/_/js/k=oz.gapi.en.7_g8FbFMIhg.O/m=client/rt=j /sv=1/d=1/ed=1/am=AQ/rs=AItRSTNRC9ZdcUhJFGX80OZ8GW_8Ym1GpA/cb=gapi.loaded_0 (4认同)

小智 1

你只需要设置这个库的onload方法

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

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

js oauth 示例