Oauth 2.0 带有服务帐户的Google OAuth2-指定要代表的用户电子邮件

Oauth 2.0 带有服务帐户的Google OAuth2-指定要代表的用户电子邮件,oauth-2.0,google-api,google-oauth,google-api-php-client,Oauth 2.0,Google Api,Google Oauth,Google Api Php Client,我试图在我的谷歌日历上以编程方式添加事件和提醒。 我正在使用服务帐户 我可以成功地将事件添加到我的谷歌日历中,但不能添加提醒。这是因为事件是通过服务帐户电子邮件添加的(类似xyz@developer.gserviceaccount.com),我应该使用我的Gmail帐户(而不是服务帐户)添加提醒) 幸运的是,可以代表我的Gmail帐户行事。请参阅本页底部: 建议添加$cred->sub=”emailaddress@yourdomain.com"; 但在添加此代码时,我遇到以下错误: Google

我试图在我的谷歌日历上以编程方式添加事件和提醒。 我正在使用服务帐户

我可以成功地将事件添加到我的谷歌日历中,但不能添加提醒。这是因为事件是通过服务帐户电子邮件添加的(类似xyz@developer.gserviceaccount.com),我应该使用我的Gmail帐户(而不是服务帐户)添加提醒)

幸运的是,可以代表我的Gmail帐户行事。请参阅本页底部:
建议添加
$cred->sub=”emailaddress@yourdomain.com";

但在添加此代码时,我遇到以下错误:

Google_Auth_异常:刷新OAuth2令牌时出错,消息:'{ “错误”:“内部故障”}”

我做错了什么,但我不知道是什么,下面是我的代码:

$applicationName = 'applicationName';
$serviceAccountEmail = 'xyzg@developer.gserviceaccount.com';
$serviceAccountKeyPath = __DIR__ . '/xyz-privatekey.p12';
$serviceAccountClientId = 'xyz.apps.googleusercontent.com';

$client = new \Google_Client();
$client->setApplicationName($applicationName);
$service = new \Google_Service_Calendar($client);

if (isset($_SESSION['service_token'])) {
    $client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($serviceAccountKeyPath);
$cred = new \Google_Auth_AssertionCredentials(
    // $serviceAccountName
    $serviceAccountEmail,
    // $scopes array List of scopes
    array('https://www.googleapis.com/auth/calendar'),
    // $privateKey
    $key
);
$client->setClientId($serviceAccountClientId);
$cred->sub = 'myEmail@gmail.com';
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
    $client->getAuth()->refreshTokenWithAssertion(); // fails on this line
}
$_SESSION['service_token'] = $client->getAccessToken();

PS:如果我取消注释
$cred->sub=myEmail@gmail.com';该代码不会引发异常

模拟用户的服务帐户仅适用于谷歌应用,请参阅

如果您希望应用程序访问任何用户的日历,则应使用标准OAuth2流获得用户的同意,并存储刷新令牌以供将来使用(因为您尝试使用服务帐户,我假设这是一个服务器端应用程序)。如果唯一的用户是您自己,并且您不打算将您的应用程序分发给任何其他人,那么您可以在服务器中硬编码刷新令牌。
以下是Google OAuth2 web服务器流的文档:

您是否仅为您的Google帐户执行此操作?或者你想代表其他用户添加事件?只有我自己的谷歌账号你才尝试过。是否授予服务帐户电子邮件访问权限,以便在您的Google帐户上写入日历?或者服务帐户允许您的谷歌帐户访问其日历?在谷歌日历中,我使用编辑权限将日历共享给服务帐户。但也许我需要一个谷歌应用程序账户,我认为这将允许服务账户代表Gmail账户行事。我必须用试用版谷歌应用账户试试这个。