使用域范围的委派服务帐户从Google App Engine访问GDrive

时间:2016-01-18 20:05:34

标签: php google-app-engine google-drive-api google-oauth

这是我第一次使用Google App Engine,所以我的一些术语可能有些偏差,请耐心等待。

我在GAE之外的网络应用程序中运行了一些php代码,它使用google-api-php-client库来访问gdrive文件夹并创建文件。它运作得非常好。

我正在尝试使用具有域范围委派的项目迁移到GAE,以便我的应用可以在我的gdrive帐户中访问/创建文件。例如,假设我的域名是kennywyland.com,我使用的Google帐户是kenny@kennywyland.com。

我创建了这样的Google客户端,这是我从https://developers.google.com/api-client-library/php/auth/service-accounts获得的:

$client = new Google_Client();
$client->setAuth(new Google_Auth_AppIdentity($client));
$client->getAuth()->authenticateForScope('https://www.googleapis.com/auth/drive');

然后我创建了这样的gdrive服务:

$service = new Google_Service_Drive($client);

我没有从中获得任何错误,并且我能够执行查询而不会抛出错误消息,但是,我将返回完全空的结果集。我的gdrive帐户中有很多文件,所以当我将以下代码发布到GAE并运行它时,我会认为我应该看到它们(retreiveAllFiles()函数来自Google的代码示例:{{3} }):

$allfiles = retrieveAllFiles($service);

print_r($allfiles);

function retrieveAllFiles($service) {
    $result = array();
    $pageToken = NULL;

    do {
        try {
            $parameters = array();
            if ($pageToken) {
                $parameters['pageToken'] = $pageToken;
            }
            $files = $service->files->listFiles($parameters);

            $result = array_merge($result, $files->getItems());
            $pageToken = $files->getNextPageToken();
        } catch (Exception $e) {
            print "An error occurred: " . $e->getMessage();
            $pageToken = NULL;
        }
    } while ($pageToken);
    return $result;
}

但是,我得到一个空的结果集。 print_r()打印一个空数组:

Array ( )

我错过了什么?我觉得我的项目/应用程序能够成功访问gdrive服务器,但它无法在我的帐户中看到与此工作域关联的任何文件。

1 个答案:

答案 0 :(得分:0)

解决方案涉及一个主要变化,需要进一步改变。主要的变化是我使用google-api-php-client v1,但我需要使用v2候选版本(奇怪地位于https://github.com/google/google-api-php-client/tree/v1-master分支中)。

他们有一个代码更改列表,需要从1.0升级到2.0(谢谢,非常方便的githubers!) https://github.com/google/google-api-php-client/blob/master/UPGRADING.md

我最终使用以下代码配置我的客户端,然后它立即能够访问gdrive,就好像它是当前登录的人一样(在我的示例中假设为'kenny@kennywyland.com',谁是我特殊的一部分)域范围授权的域名。)

require_once('vendor/autoload.php');

$client = new Google_Client();

$client->setAuthConfig('myapp-xxxxxxxx.json');
$user_to_impersonate = "kenny@kennywyland.com";
$client->setSubject($user_to_impersonate);

$client->addScope('https://www.googleapis.com/auth/drive');

$service = new Google_Service_Drive($client);

我的开发者控制台中为我的应用程序的服务帐户生成了myapp-xxxxxxx.json文件。