无法使用Google Calendar Api v3获取访问令牌

时间:2014-06-12 15:35:52

标签: php google-calendar-api google-api-php-client

我正在尝试将日历事件放入日历而不显示身份验证提示。我已经读过,使用OAuth服务帐户可以执行此操作。我已在我的Google Developer Console中设置了服务帐户,但我对此没有任何好运。

我们有一个Google商家帐户,我将我的委派用户设置为我们帐户的管理员,以便他们可以访问任何人的日历,但不会创建该活动。我认为问题在于访问令牌。当我var_dump($accessToken)时,它会显示NULL

<?php
error_reporting(E_ALL);
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';
session_start();    

/* Authentication ID's */    
const CLIENT_ID = '[MY CLIENT ID]';
const SERVICE_ACCOUNT_NAME = '[MY SERVICE ACCOUNT]';
const KEY_FILE = '[MY KEY FILE].p12';
const CALENDAR_SCOPE = "https://www.googleapis.com/auth/calendar";
$key = file_get_contents(KEY_FILE);
$auth = new Google_Auth_AssertionCredentials(
  SERVICE_ACCOUNT_NAME,
  array(CALENDAR_SCOPE),
  $key
);
$auth->sub = "adminaccount@email.com";

$client = new Google_Client();
$client->setScopes(array(CALENDAR_SCOPE));
$client->setAssertionCredentials($auth);

$client->getAuth()->refreshTokenWithAssertion();
$accessToken = $client->getAccessToken();

$client->setClientId(CLIENT_ID);

$user = "testaccount@email.com";

if($accessToken){

  $cal = new Google_Service_Calendar($client);

  $event = new Google_Service_Calendar_Event();
  $event->setSummary('TITLE');
  $event->setLocation('World');
  $event->setDescription('test');

  $start = new Google_Service_Calendar_EventDateTime();
  $start->setDate(date('yyyy-mm-dd'));
  $event->setStart($start);

  $end = new Google_Service_Calendar_EventDateTime();
  $end->setDate(date('yyyy-mm-dd'));
  $event->setEnd($end);

  $cal->events->insert($user, $event);
}
?>

我已经引用了另一个帖子(Using a Service Account, getAccessToken() is returning null)来尝试解决这个问题,但没有运气。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

听起来您需要授予对Google Apps域用户数据的访问权限。以下链接“将域范围的权限委派给您的服务帐户”。

https://developers.google.com/drive/web/delegation

答案 1 :(得分:0)

您可以尝试像这样设置身份验证:

$auth = new Google_Auth_AssertionCredentials(
        SERVICE_ACCOUNT_NAME,
        SCOPES,
        $key,
        'notasecret',
        'http://oauth.net/grant_type/jwt/1.0/bearer',
        ADMIN_USER
        );