【问题标题】:How to use Google Service Account to retrieve Google Drive activities via Activity API?如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?
【发布时间】: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 凭据,而不是服务帐户凭据,它可以正常工作。但这就是问题 - 我真的需要为服务帐户工作。

【问题讨论】:

    标签: php google-api google-api-php-client service-accounts google-drive-activity-api


    【解决方案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】:

    (代表问题作者发布解决方案,将其移至答案空间)

    使用公认的答案,并对此进行一些阅读,我的工作正常。这是我为使其正常工作所做的工作。

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

    2. 在上面的同一链接中,在“将域范围的权限委派给您的服务帐户”下,将服务帐户设置为具有域委派。这些说明不是很好,因为它们并没有真正谈论范围。在执行所有这些操作时,尚不清楚用户模拟工作是否需要一些范围,以及某些 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);
    

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 2017-08-31
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 2014-02-25
      • 2021-02-10
      • 1970-01-01
      • 2014-09-26
      相关资源
      最近更新 更多