首页 > 解决方案 > 如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?

问题描述

我的个人 Google 帐户下有一个 Google Drive。我还在我的个人 Google 帐户下设置了一个带有服务帐户的 Google App。该服务帐户具有所有者角色。

我正在尝试使用服务帐户来获取我的 Google Drive 中某个文件夹上的最近活动列表。我将服务帐户电子邮件添加为具有编辑权限的文件夹的共享用户。但是,每当我运行 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 凭据,而不是服务帐户凭据,它可以工作。但这就是问题 - 我真的需要为服务帐户工作。

标签: phpgoogle-apigoogle-api-php-clientservice-accountsgoogle-drive-activity-api

解决方案


如果您检查 Drive 活动 api 文档的Auth部分。您会注意到它并没有说支持服务帐户。

它实际上不能正常工作的原因是这个。

Activity API 由 DriveActivity 资源(表示对用户Google Drive 中的对象所做的更改)和查询方法(允许您检索有关这些更改的信息)组成。

它正在为该用户寻找更改。不适用于您与服务帐户共享的驱动器上的文件夹或目录

服务帐户是用户,如果该用户没有更改任何内容,那么您将看到“无活动”

尽管我认为服务帐户的全部意义在于代表某人(在这种情况下是我自己)获取数据访问权限。

在某种程度上,但您目前正在代表服务帐户执行此操作。您尚未将权限委派给其他用户。需要明确的是,与服务帐户共享文件夹并不构成设置委托,以便它可以代表您行事。所以 ...

为此,您需要从工作区帐户启用域范围的委派。这可能值得一试。


推荐阅读