我正在尝试通过PHP为一个特定用户创建日历活动 - 比如developement@example.com。
我在Google Developers Console中创建了服务帐户,获得了ClientID,电子邮件地址和私钥。身份验证使用代码完成:
$client = new Google_Client();
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$cred = new Google_Auth_AssertionCredentials(
'somelongstring@developer.gserviceaccount.com.',
array('https://www.googleapis.com/auth/calendar','https://www.googleapis.com/auth/calendar.readonly'),
file_get_contents('p12 file'));
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();
这种类型的身份验证似乎很好。但所有事件都是以用户身份创建的,其电子邮件地址为somelongstring@developer.gserviceaccount.com,而不是developement@example.com。
我尝试过设置子参数:
$cred = new Google_Auth_AssertionCredentials(
....
$cred->sub = 'developement@example.com';
$client->setAssertionCredentials($cred);
但是这段代码抛出异常:
Google_Auth_Exception: Error refreshing the OAuth2 token, message: '{ "error" : "access_denied", "error_description" : "Requested client not authorized." }'
现在我迷路了。有什么建议吗?
答案 0 :(得分:3)
好的,已解决; - )
问题在于自己领域的发展。
正如other question和Google SDK Guide中所述,我必须将服务帐户的访问权限授予我请求访问权限的所有范围。我忘了添加只读范围。