使用服务帐户从PHP调用google apps脚本执行api

使用服务帐户从PHP调用google apps脚本执行api,php,google-apps-script,service-accounts,Php,Google Apps Script,Service Accounts,我试图使用一个服务帐户从php调用一个非常简单的GoogleApps脚本,这样只有我的服务器才能访问它,而不是网站的用户 我是这样做的。我在这里创建脚本 当我保存一个新项目时,它会自动关联。 然后我打开File>Project Properties以获取scriptId=mm8zqofs1oicnfinslm1cgel5qmrmvt 通过单击显示的弹出窗口顶部的project链接,我可以访问相关项目的开发者控制台Resources>project Developers console 然后我单击

我试图使用一个服务帐户从php调用一个非常简单的GoogleApps脚本,这样只有我的服务器才能访问它,而不是网站的用户

我是这样做的。我在这里创建脚本

当我保存一个新项目时,它会自动关联。 然后我打开
File>Project Properties
以获取
scriptId=mm8zqofs1oicnfinslm1cgel5qmrmvt

通过单击显示的弹出窗口顶部的project链接,我可以访问相关项目的开发者控制台
Resources>project Developers console

然后我单击“激活并管理API”并激活“谷歌应用程序脚本执行API”。我单击“凭据”,看到前面的操作自动创建了OAuth2凭据。但我需要的是服务帐户凭据。然后我创建一个
addcredentials>Service account
,并下载生成的p12文件。我得到了
clientId=109160023321840004240
clientMail=account-1@project-此服务帐户的id uokwrcpiqeewhwvpdhb.iam.gserviceaccount.com

我回到我的脚本,并与具有读写权限的服务帐户电子邮件共享它
文件>共享
。首先,我在我的个人邮箱中收到一封电子邮件,通知我

Delivery to the following recipient failed permanently:

 account-1@project-id-uokwrcpiqeewhwvpdhb.iam.gserviceaccount.com
然后,我将脚本发布为一个执行API
publish>publish作为一个执行API
,每个人都可以访问

现在让我们进入PHP服务器端。使用此处提供的“Google API Client Library for PHP”,我尝试从PHP调用脚本函数:

$client = new Google_Client();
$client->setClientId('109160023321840004240');
$client->setApplicationName('myScript');

$cred = new Google_Auth_AssertionCredentials(
    'account-1@project-id-okwrcpiqeewhwvpdhb.iam.gserviceaccount.com',
    [/*no scope nedeed for this simple script*/],
    file_get_contents('path_to_myScript.p12')
);
$client->setAssertionCredentials($cred);

if ($client->getAuth()->isAccessTokenExpired()) {
    $client->getAuth()->refreshTokenWithAssertion($cred);
}

$service = new Google_Service_Script($client);
$scriptId = 'MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt';

// Create an execution request object.
$request = new Google_Service_Script_ExecutionRequest();
$request->setFunction('get');
$response = $service->scripts->run($scriptId, $request);
这是我一直得到的回应

Error calling POST https://script.googleapis.com/v1/scripts/MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt:run: (403) The caller does not have permission
如果在部署脚本时,我选择将访问权限授予“仅限我”,则会得到以下响应

Error calling POST https://script.googleapis.com/v1/scripts/MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt:run: (404) Requested entity was not found.

如果你们中有人能帮我一个忙,我将非常高兴:)

应用程序脚本还不支持带有执行api的服务帐户。看


谷歌表示,他们正在调查此事,但显然不会很快发生(基于谷歌在谷歌+帖子上对类似事件的回复)

Ok Zig。非常感谢您这么快地帮助我,这样我就不用花更多的时间来调查我是否错了:)我做了,但我的投票只有在我有15票时才会出现(对不起)您知道我可以使用的解决方法吗?这样我的服务器就可以调用我自己的脚本,而无需提示我的网站用户进行授权?服务器密钥可以工作吗?查看不同的应用程序脚本发布选项。您可以创建自己的服务。问题是我希望此脚本作为“我”(脚本所有者)或我授予完全访问权限的帐户服务执行。我不想与我网站的用户共享该脚本,也不想向他们请求运行脚本的权限。因为脚本url位于您的服务器上,所以不太可能有人猜到它。添加一个类似密码的参数,它甚至更加模糊。只要不在其他地方公开url,就很难猜测oauth标记。
Error calling POST https://script.googleapis.com/v1/scripts/MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt:run: (404) Requested entity was not found.