从在Google Compute VM实例上运行的PHP脚本访问Google BigQuery数据集

时间:2017-12-07 13:31:42

标签: php authorization google-bigquery

我正在尝试从运行在Google Compute VM实例上的PHP脚本访问BigQuery数据集 - 我已经在其上安装了Bitnami的LAMP堆栈。

数据集由另一方拥有,但该方使用我的电子邮件地址为数据集提供了完全所有权角色。他们还使用我的电子邮件地址给了我另一个数据集的读取角色。

我的PHP脚本旨在从我获得读取权限的数据集表中读取数据,按下该数据,并将其写入数据集中已被赋予完全所有权角色的表。

我花了很多时间试图设法如何设置正确的授权,运行我所提到的电子邮件地址下的所有内容,但到目前为止,我仍然收到“您没有权限...”类型的错误尝试从一个数据集读取数据或将其写入另一个数据集时。

如上所述,BigQuery数据集并非由我拥有,但我已经获得了项目ID和所涉及的数据集的名称,并且两者的所有者都使用我的电子邮件地址来设置上面讨论的访问权限。 / p>

有没有人可以通过简单的分步指导来了解如何实现上述目标。数据集的所有者是否需要两个做比已经描述的更多的事情?我发现在谷歌帮助的许多页面上工作非常混乱!

1 个答案:

答案 0 :(得分:1)

您需要服务帐户密钥文件,该文件附带了不同的电子邮件地址。应该授予服务帐户电子邮件权限,而不是您的电子邮件。实际上两者都是,因为你使用一个在UI上工作,另一个在你开发的应用程序上。

我已经为您提供了一个完整的PHP示例。

您需要设置服务帐户默认凭据,并查看包含putenvuseApplicationDefaultCredentials()的行。这是我使用库https://github.com/google/google-api-php-client

的工作代码

您需要从控制台获取服务帐户密钥文件:https://console.cloud.google.com/iam-admin/serviceaccounts/

<强> composer.json

{
    "require": {
        "google/cloud": "^0.13.0",
        "google/apiclient": "^2.0"
    }
}

php文件

# Imports the Google Cloud client library
use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\ServiceBuilder;

$query="SELECT repository_url, 
       repository_has_downloads 
FROM   [publicdata:samples.github_timeline]
LIMIT  10";
$client = new Google_Client();
putenv('GOOGLE_APPLICATION_CREDENTIALS='.dirname(__FILE__) . '/.ssh/dummyname-7f0004z148e1.json');//this can be created with other ENV mode server side
$client->useApplicationDefaultCredentials();

$builder = new ServiceBuilder([
                'projectId' => 'edited',
        ]);

        $bigQuery = $builder->bigQuery();

        $job = $bigQuery->runQueryAsJob($query);
        $info=$job->info();
//      print_r($info);
//      exit;
        $queryResults = $job->queryResults();

        /*$queryResults = $bigQuery->runQuery(
            $query,
            ['useLegacySql' => true]);*/

        if ($queryResults->isComplete()) 
        {
            $i = 0;
            $rows = $queryResults->rows();

            foreach ($rows as $row) 
            {
                $i++;

                $result[$i] = $row;
            }
        } 
        else 
        {
            throw new Exception('The query failed to complete');
        }

        print_r($result);