如何在不使用谷歌应用的情况下授权谷歌驱动服务账户访问谷歌账户?

Posted

技术标签:

【中文标题】如何在不使用谷歌应用的情况下授权谷歌驱动服务账户访问谷歌账户?【英文标题】:How do I authorize a google drive service account access to a google account without using google apps? 【发布时间】:2013-01-06 21:36:04 【问题描述】:

我想使用 Google 云端硬盘作为我正在制作的网站的准 CMS,以便内容所有者可以使用 Google 云端硬盘编辑他们的内容。我想使用可以访问 Google Drive 的特定用户帐户(在撰写本文时,服务帐户不能直接访问 Google Drive)并且能够与内容所有者共享文档。

通读API和教程后,我在delegation中找到了答案:https://developers.google.com/drive/delegation

我对这个过程的主要问题是该网站不是由 Google Apps 管理的,因此“将域范围的权限委派给您的服务帐户”中概述的步骤让我感到困惑 - 似乎应该可以处理这个委派不使用 Google Apps,但在 Google Drive 中为我的特定用户帐户搜索设置后,我似乎找不到授权模拟的能力。

我正在使用的代码的 sn-p:

static public function getService() 
  $key = file_get_contents(GOOGLEAPI_KEYFILE);
  $auth = new Google_AssertionCredentials(GOOGLEAPI_SERVICE_EMAIL, array(GOOGLEAPI_SCOPE), $key);
  $auth->setPrn(GOOGLEAPI_IMPERSONATION);
  self::$apiClient = new Google_Client();
  self::$apiClient->setUseObjects(true);
  self::$apiClient->setAssertionCredentials($auth);
  return new Google_DriveService(self::$apiClient);

GOOGLEAPI_IMPERSONATION 是特定的用户帐户,当我运行此代码时,异常状态:

刷新 OAuth2 令牌时出错,消息:' "error" : "access_denied"

有人提供帮助吗?我是否误解了 oAuth 在授权方面的工作原理?

【问题讨论】:

【参考方案1】:

服务帐户适用于两种不同的情况:

授权应用程序/进程使用自己的身份验证和调用服务。想想数据归应用所有的预测、云存储等服务。 在 google 应用程序域中模拟用户,域管理员可以预授权应用程序代表其域中的用户执行操作。

模拟适用于 Google Apps 域,因为管理员有一种机制可以通过控制面板为用户带外授权应用。当然,他们只能授权该应用访问他们管理的帐户的数据。对于不属于组织的个人用户,应用需要使用正常的 OAuth 流程向每个用户请求授权。

我有一段时间没有对其进行测试,但最后我检查了是否可以将 Drive 与充当自身的服务帐户一起使用。我遇到的唯一限制是无法购买额外配额,并且该应用仅限于最初的 5GB 免费存储空间。

【讨论】:

史蒂夫,感谢您的回复。我已成功使用服务帐户上传和阅读文档,没有任何问题。但是,无法通过 Google Docs Web UI 访问上传的文档,这是一项要求。此外,用户特定的 oAuth 不起作用的原因是因为我只想将 Google Docs 服务帐户用作包含用于在网站上填充内容的文档的存储桶 - 因此,如果 Google 用户访问该站点,则他们不需要对他们的帐户或任何东西进行 oAuth。 更正服务帐户无权访问 Web UI。如果这是一个要求,你有几个选择。首先是与需要能够访问它们的用户共享文档。所需要的只是知道他们的电子邮件地址。或者,您可以换个方向,在其他帐户中编写文档,然后与服务帐户共享。最后,如果只有一个帐户需要访问,请授权使用具有离线访问权限的普通 oauth,并让应用代表该用户执行操作。 谢谢史蒂夫 - 当我回到这个项目时,我会更多地研究这个

以上是关于如何在不使用谷歌应用的情况下授权谷歌驱动服务账户访问谷歌账户?的主要内容,如果未能解决你的问题,请参考以下文章

无论如何要在不下载的情况下解压缩谷歌驱动器中的 zip 或 tar

是否可以在不先将对象作为文件保存到谷歌驱动器的情况下从谷歌 colab 下载对象作为文件?

如何在不使用谷歌地图 api 的情况下获取方向箭头

如何从PHP脚本访问我的谷歌驱动器,无需手动授权

如何在不使用 kml 的情况下向 android studio 中的谷歌地图应用程序添加大量多边形

如何在不使用谷歌地图和其他地图的情况下获取用户当前位置?