37

私はしばらくの間、google api javascript クライアント ライブラリを chrome 拡張機能と結び付けようと試みてきましたが、chrome 拡張機能には足が冷えるというひどいケースがあるようです。スクリプトへのリンクは

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

スクリプトは実際に他のスクリプトをロードするため、ファイルのダウンロードは面倒です。マニフェストに含めてみました

manifest.json (抜粋)

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

しかし、拡張機能は読み込まれません。また、スクリプトをバックグラウンド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);

しかし、クロムデバッガーは私に与えます

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

何かアイデアはありますか、それとも別々に保管される運命ですか?

編集: コールバック関数を利用する場合は、スクリプト URL に「?onload=myCallbackFunction」を追加する必要があることに注意してください。ありがとうイリヤ。詳細はこちら

4

5 に答える 5

23

これまでのところ、私が見つけた唯一の解決策は、最初にスクリプトをバックグラウンド 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);

次に、セキュリティ警告を回避するには、マニフェスト ファイル ( source )を編集します。

manifest.json (抜粋)

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

ただし、セキュリティのバイパスはhttpsリンクに対してのみ機能することに注意してください。また、ちょっとハックだと思います...他のソリューションは大歓迎です

于 2013-09-08T09:12:14.033 に答える
12

のソースコードに興味深いものを見つけましたhttps://apis.google.com/js/client.js。それは読みます:

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

gapi.loadclient.jsがWeb ページにロードされるとすぐに呼び出されます。ロードさwindow.gapi_onloadれるとコールバックとして呼び出されるようです。gapi.client

概念実証として、私はこのプランカーを作成しました: http://plnkr.co/edit/TGvzI9SMKwGM6KnFSs7U

gapi.authとの両方gapi.clientがコンソールに正常に出力されます。


Chrome 拡張機能に戻ります。

これを私の背景セクションに入れましたmainfest.json

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

これ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.
}

background.jsより前にロードされることに注意してくださいgapi-client.jsgapi-client.js読み込まwindow["gapi_onload"]れるとすぐに読み込まれるため、window.gapi_onloadその前に指定する必要があります。

その結果、期待どおりにwindow.gapi_onload呼び出され、両方が取り込まれます。gapi.authgapi.client

私のソリューションではbackground.html、自分で作成しませんでした。コンテンツ セキュリティ ポリシーも変更しませんでした。ただし、解決策はかなり文書化されていないため、将来変更される可能性があることに注意してください。

于 2014-06-27T18:41:28.450 に答える
1

このライブラリの onload メソッドを設定するだけです

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

および handleClientLoad - デフォルトの登録方法。

js oauth のサンプル

于 2013-09-08T08:27:52.237 に答える
0

woojoo666 の提案としてマニフェスト ファイルを追加しようとしましたが、それでも失敗しました。フラグ「unsafe-eval」をもう 1 つ追加する必要があるようです。

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

于 2014-03-04T06:15:29.030 に答える