Chrome 应用程序可以直接访问 Google API(如 Drive)(即没有 web 视图)吗?

Posted

技术标签:

【中文标题】Chrome 应用程序可以直接访问 Google API(如 Drive)(即没有 web 视图)吗?【英文标题】:Can a Chrome App access Google APIs (like Drive) directly (ie. without a webview)? 【发布时间】:2014-08-24 02:18:02 【问题描述】:

我正在写一个Chrome App,我想使用Google Drive API 让我的用户读/写文件到他们自己的Google Drive。

我发现信息表明,从 Chrome 应用程序通过 OAuth 流程的唯一方法是使用 web 视图(请参阅之前的 *** 问题 Google Drive Realtime API in a Chrome Packaged App)。

这个限制对我来说很有意义,因为要通过 OAuth 流程,您必须加载外部内容,并且从安全角度来看,将其与特权 Chrome 应用代码隔离听起来很重要。

但是,一旦您拥有 OAuth 访问令牌,Chrome 应用中的 javascript 似乎应该能够直接向 Google Drive API 发出请求。这不会将任何内容(即 html 或 JS)加载到浏览器中,它只是调用远程 API 来读取/写入数据。

但似乎唯一受支持的使用 Google JavaScript API 的方法是远程加载它,使用如下代码:

<script src="https://apis.google.com/js/client.js"></script>

这不起作用,因为不允许 Chrome 应用加载远程内容。

而我只是下载 client.js 并将其放到我的本地 Chrome 应用程序目录中的想法行不通,因为 client.js 似乎假设它可以继续下载/执行更多必要的 JavaScript。

所以基本上,据我所知,Google JavaScript API 似乎不利于提前下载并仅从本地文件运行。这听起来准确吗?如果是这样,应用程序从 API 获取远程数据的唯一方法是在 webview 和主应用程序之间传递消息,这听起来很痛苦。

有什么解决办法吗?或者我是否必须通过网络视图将所有数据传输到 API 或从 API 传输? :(

【问题讨论】:

如果你尝试这样的事情会发生什么? ***.com/a/8578840/1112669 "拒绝加载脚本'google-analytics.com/ga.js',因为它违反了以下内容安全策略指令:"default-src 'self' chrome-extension-resource:"。请注意,'script-src ' 没有明确设置,所以 'default-src' 被用作后备。”好主意! 好的,这个怎么样? ***.com/a/8861191/1112669 "尝试安装此扩展程序时出现警告:'content_scripts' 仅允许用于扩展程序和旧版打包应用程序,但这是一个打包应用程序。" 【参考方案1】:

使用身份 API,特别是 chrome.identity.getAuthToken 来获取授权。它封装了 OAuth 工作。然后,一旦获得授权,使用 Ajax 执行特定的 API(例如,到像 https://www.googleapis.com/METHOD 这样的 URL,其中 METHOD 是方法。)

换句话说,您可以直接访问 Google API,无需处理 OAuth 的复杂性,当然也无需费心使用 webview。

在你的 manifest.json 中,你需要这样的东西:

"permissions": [
    "identity"
],
"oauth2": 
    "client_id": "....apps.googleusercontent.com",
    "scopes": [
        "https://www.googleapis.com/auth/drive"
    ]

【讨论】:

感谢 getAuthToken 提示。这将有助于避免在身份验证步骤中使用 webview。但我的问题更多是关于如何访问 API post-auth。所有代码示例都使用 Google JavaScript API 客户端,以及类似 gapi.client.drive.files.get() 的代码。但是提供该 API 的客户端库似乎并不容易或无法下载。这就是我的问题所在,而不是身份验证步骤。 我认识到我可以手动发出所有 REST 请求,但我希望使用更高级别的客户端库,使其看起来像函数调用,而不必手动构建请求,将身份验证令牌放在正确的位置等。 我使用一个简单的界面来访问 API。它采用方法的名称(成为 URL 路径的一部分)和参数作为参数。 @JoshHaberman 我目前正在为 Google Sheets API 构建一个 Chrome Identity Javascript 客户端库,希望能在未来增加对其他人的支持 :)

以上是关于Chrome 应用程序可以直接访问 Google API(如 Drive)(即没有 web 视图)吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Chrome 扩展程序在 Google Chrome 浏览器中访问搜索查询文本

从Chrome扩展程序访问Google文档

google访问助手

如何安装chrome扩展,以json-handle为例

Chrome 扩展程序和 gmail.js 阻止访问 google api

良心推荐Chrome插件,真的非常好用!