如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?
Posted
技术标签:
【中文标题】如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?【英文标题】:How to use Google Service Account to retrieve Google Drive activities via Activity API? 【发布时间】:2021-12-21 22:49:20 【问题描述】:我的个人 Google 帐户下有一个 Google 云端硬盘。我还在我的个人 Google 帐户下设置了一个带有服务帐户的 Google App。该服务帐号具有所有者角色。
我正在尝试使用服务帐户来获取我的 Google 云端硬盘中某个文件夹的近期活动列表。我将服务帐户电子邮件添加为具有编辑权限的文件夹的共享用户。但是,每当我运行 Google Activity API 时,我都没有得到任何活动结果,即使我在共享文件夹中执行各种操作,例如添加文件。
我在 php 中通过
$client = new Google_Client();
$client->setApplicationName('Some App');
$client->setAuthConfig( __DIR__ . '/service_account.json');
$client->setScopes(Google_Service_DriveActivity::DRIVE_ACTIVITY_READONLY);
$client->fetchAccessTokenWithAssertion();
$service = new Google_Service_DriveActivity($client);
// Print the recent activity in your Google Drive.
$request = new Google_Service_DriveActivity_QueryDriveActivityRequest();
$request->setPageSize(10);
$results = $service->activity->query($request);
if (count($results->getActivities()) == 0)
print "No activity.\n";
else // do something
它总是触发“无活动”。我单步执行代码,没有错误。服务帐号附加到的项目启用了 Google Activity API。
也许这不起作用,因为服务帐户不是执行活动的帐户?虽然我认为服务帐户的全部意义在于代表某人(在这种情况下是我自己)获取数据访问权限。
我刚刚进行了测试 - 我为我的应用程序使用了 Oauth2 凭据,而不是服务帐户凭据,它可以正常工作。但这就是问题 - 我真的需要为服务帐户工作。
【问题讨论】:
【参考方案1】:如果您查看 Drive 活动 api 文档的 Auth 部分。您会注意到它并没有说支持服务帐户。
实际上它运行不好的原因是这个。
Activity API 由 DriveActivity 资源和查询方法组成,DriveActivity 资源表示对用户的 Google Drive 中的对象所做的更改,查询方法允许您检索有关这些更改的信息。
它正在为该用户寻找更改。不适用于您与服务帐户共享的驱动器上的文件夹或目录
服务帐户是用户,如果该用户没有更改任何内容,那么您将看到“无活动”
虽然我认为服务帐户的全部意义在于代表某人(在本例中是我自己)获取数据访问权限。
这在某种程度上是,但您目前正在代表服务帐户执行此操作。您尚未将权限委派给其他用户。需要明确的是,与服务帐户共享文件夹并不构成设置委托,以便它可以代表您行事。所以...
为此,您需要从工作区帐户启用域范围的委派。这可能值得一试。
【讨论】:
有趣的是,我几个小时前才开始设置 Google Workspace。我认为域委派是这里的关键。但实际上,我感兴趣的是文件被添加到文件夹的通知。 files.watch 和 changes.watch 方法没有提供有关更改内容的足够详细信息,因此虽然我可以通过我的服务帐户收到更改通知,但我正在尝试检测是否添加了文件。我确实怀疑与代表团一起走这条路可能是要走的路。但真的对其他想法持开放态度!谢谢 我现在有一个 Google Workspace 帐户并为该管理员帐户设置了我的应用程序。我创建了服务帐户并下载了 JSON 凭证。我为帐户管理员设置了域委派权限,它要求提供 OAuth2 的范围,我选择了googleapis.com/auth/admin.directory.user。但是在使用 Activity API 时,我仍然看不到活动。似乎很少有关于将这些服务帐户与 Activity API 一起使用的信息。所以不确定这里可能缺少哪一块拼图...... 您是否修复了代码以添加 deligation? 是的,但我认为我没有添加正确的范围,或者可能事情正在发生,因为我认为我必须为服务帐户添加角色,并且在管理面板中将管理员角色分配给服务帐户。然后我重新做了所有事情,没有弄乱角色,只是创建了基本的服务帐户,然后在管理面板中添加了具有特定范围的委托。现在工作!【参考方案2】:(代表问题作者发布解决方案,将其移至答案空间)。
使用公认的答案,并对此进行一些阅读,我的工作正常。这是我为使其正常工作所做的工作。
按照常规说明创建服务帐户(例如此处:https://developers.google.com/admin-sdk/directory/v1/guides/delegation,在“创建服务帐户和凭据”下)
在上面的同一链接中,在“将域范围的权限委派给您的服务帐户”下,将服务帐户设置为具有域委派。这些说明不是很好,因为它们并没有真正谈论范围。在执行所有这些操作时,尚不清楚用户模拟工作是否需要一些范围,以及某些 API 的范围,例如 Google Drive API 或 Drive Activity。我选择了这些:
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/drive.activity.readonly
https://www.googleapis.com/auth/admin.directory.user
但真的不确定在我的情况下是否只需要https://www.googleapis.com/auth/drive.activity.readonly
。我可以很容易地测试它,但现在不用担心。
-
然后在我的 PHP 代码中,我按照上面的方式进行操作,但需要使用
$client->setSubject('myemail');
行,我在阅读此处后终于明白了:
https://github.com/googleapis/google-api-php-client#delegatingauthority
在“服务帐户身份验证”下。像这样:
$client = new Google_Client();
$client->setApplicationName('Some App');
$client->setAuthConfig( __DIR__ . '/service_account.json');
$client->setScopes(Google_Service_DriveActivity::DRIVE_ACTIVITY_READONLY);
$client->fetchAccessTokenWithAssertion();
$client->setSubject('myemail');
$service = new Google_Service_DriveActivity($client);
// Print the recent activity in your Google Drive.
$request = new Google_Service_DriveActivity_QueryDriveActivityRequest();
$request->setPageSize(10);
$results = $service->activity->query($request);
【讨论】:
以上是关于如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过服务帐户通过 Google BigQuery External Table 访问 Google Sheets Doc
如何通过 Google Drive .NET API v3 使用服务帐户访问 Team Drive
如何通过 terraform 使用服务帐户创建 google cloud pubsub pull 订阅?
如何通过 Google Drive 和 App Engine SDK 使用 Oauth2 服务帐户