如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?

How to use Google Service Account to retrieve Google Drive activities via Activity API?

我的个人 Google 帐户下有一个 Google 驱动器。我还在我的个人 Google 帐户下设置了一个带有服务帐户的 Google 应用程序。该服务帐户具有所有者角色。

我正在尝试使用服务帐户在我的 Google 驱动器中的某个文件夹中获取最近 activity 的列表。我将服务帐户电子邮件添加为具有编辑权限的文件夹的共享用户。但是每当我 运行 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

它总是触发“No activity”。我单步执行代码,没有错误。服务帐户附加到的项目已启用 Google Activity API。

也许这不起作用,因为服务帐户不是执行活动的帐户?虽然我认为服务帐户的全部意义在于代表某人(在本例中是我自己)获取数据访问权限。

我刚刚做了测试 - 我为我的应用程序使用了我的 Oauth2 凭据而不是服务帐户凭据并且它有效。但这就是问题 - 我真的需要它为服务帐户工作。

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

它实际上运行不佳的原因是这个。

The Activity API consists of the DriveActivity resource, which represents changes made to objects within a user's Google Drive, and the query method, which allows you to retrieve information about those changes.

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

服务帐户是一个用户,如果该用户没有更改任何内容,那么您将看到“否 activity”

Though I thought the whole point of a service account is to get data access on behalf of someone (in this case the someone being myself).

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

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

(代题者贴出答案移至答案space).

使用已接受的答案,并阅读一些相关内容,我已经开始工作了。这是我为使它正常工作所做的工作。

  1. 按照常规说明创建服务帐户(例如此处:https://developers.google.com/admin-sdk/directory/v1/guides/delegation,在“创建服务帐户和凭据”下)

  2. 与上面相同的 link,在“将全域权限委派给您的服务帐户”下,将服务帐户设置为具有域委派。这些说明不是很好,因为它们并没有真正谈论范围。在执行所有这些操作时,尚不清楚是否存在用户模拟工作所需的范围,以及某些 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。我可以很容易地测试它,但现在不用担心。

  1. 然后在我的 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);