Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 服务帐户无法查看与之显式共享的显示日历_Php_Google Api_Google Calendar Api_Google Api Php Client_Service Accounts - Fatal编程技术网

Php 服务帐户无法查看与之显式共享的显示日历

Php 服务帐户无法查看与之显式共享的显示日历,php,google-api,google-calendar-api,google-api-php-client,service-accounts,Php,Google Api,Google Calendar Api,Google Api Php Client,Service Accounts,我试图从服务帐户访问所有组织日历,但日历/事件不可查看-即使它们已与服务帐户明确共享 我一直在关注这个问题。和(转换为日历服务) 我感到惊讶的是,服务帐户无法自动拥有管理员级别的日历访问权限,但即使是显式共享也无法提供所需的访问权限 如果有人发现我遗漏或误解了什么,请告诉我。任何帮助都将不胜感激 迈克 set_include_path(get_include_path().path_分隔符'google api php-client master/src'); 需要_once“google ap

我试图从服务帐户访问所有组织日历,但日历/事件不可查看-即使它们已与服务帐户明确共享

我一直在关注这个问题。和(转换为日历服务)

我感到惊讶的是,服务帐户无法自动拥有管理员级别的日历访问权限,但即使是显式共享也无法提供所需的访问权限

如果有人发现我遗漏或误解了什么,请告诉我。任何帮助都将不胜感激

迈克

set_include_path(get_include_path().path_分隔符'google api php-client master/src');
需要_once“google api php client master/src/google/autoload.php”;//或者autoload.php所在的任何位置
需要一次“google api php客户端/src/google/client.php”;
需要一次“google api php客户端/src/google/Service/Calendar.php”;
需要一次“google api php客户端/src/google/Service/Oauth2.php”;
定义('日历范围','https://www.googleapis.com/auth/calendar.readonly');
定义('SERVICE\u ACCOUNT\u EMAIL','DEV_EMAIL@developer.gserviceaccount.com');
定义('SERVICE_ACCOUNT_PKCS12_FILE_PATH','P12_FILE.P12');
函数构建服务($userEmail){
$key=文件\获取\内容(服务\帐户\ PKCS12\文件\路径);
$auth=新的Google\u auth\u断言属性(
服务、帐户、电子邮件、,
数组(日历范围),
$key);
$auth->sub=$userEmail;
$client=新的Google_客户端();
$client->setAssertionCredentials($auth);
返回新的谷歌日历($client);
}
$v\u calendarId\u primary=“用户_CHOSEN@email.com";
$service=buildService($v\u calendarId\u primary);
$calendarId='primary';
$optParams=阵列(
“maxResults”=>10,
'orderBy'=>'startTime',
“singleEvents”=>TRUE,
'timeMin'=>date('c'),
);
$results=$service->events->listEvents($v\u calendarId\u primary,$optrams);
如果(计数($results->getItems())==0){
打印“未找到即将发生的事件。\n
”; }否则{ 打印“即将举行的活动:\n
”; foreach($results->getItems()作为$event){ $start=$event->start->dateTime; if(空($start)){ $start=$event->start->date; } printf(“%s(%s)\n
”,$event->getSummary(),$start); } }
试着在用户身上做一个测试_CHOSEN@email.com. 这将确保您可以自行访问日历。然后再次检查您为服务帐户授予的权限。至少您需要查看所有活动的详细信息


您的代码在我看来很好,只是我认为您没有访问权限。

非常感谢您检查DalmTo。我现在有更多关于这方面的信息,这可能会有所帮助。如果我在匿名模式下运行我的应用程序,那么由于服务帐户凭据,它当然不必登录。但是,用户需要登录才能访问应用程序运行的环境,我现在意识到,这里声明的是他们的凭据/权限,而不是服务帐户。因此,我需要以某种方式忽略登录用户的凭据。使问题进一步复杂化的是,最终目标是嵌入目标日历,但这样的尝试会抛出X帧拒绝,因为它试图在“匿名”窗口中显示登录框,因此,我可以列出事件,但现在嵌入-odd。
set_include_path(get_include_path() . PATH_SEPARATOR . 'google-api-php-    client-master/src');
require_once 'google-api-php-client-master/src/Google/autoload.php'; // or wherever autoload.php is located

require_once "google-api-php-client/src/Google/Client.php";
require_once "google-api-php-client/src/Google/Service/Calendar.php";
require_once "google-api-php-client/src/Google/Service/Oauth2.php";

define('CALENDAR_SCOPE', 'https://www.googleapis.com/auth/calendar.readonly');
define('SERVICE_ACCOUNT_EMAIL', 'DEV_EMAIL@developer.gserviceaccount.com');
define('SERVICE_ACCOUNT_PKCS12_FILE_PATH', 'P12_FILE.p12');

function buildService($userEmail) {
  $key = file_get_contents(SERVICE_ACCOUNT_PKCS12_FILE_PATH);
  $auth = new Google_Auth_AssertionCredentials(
      SERVICE_ACCOUNT_EMAIL,
      array(CALENDAR_SCOPE),
      $key);
  $auth->sub = $userEmail;
  $client = new Google_Client();
  $client->setAssertionCredentials($auth);
  return new Google_Service_Calendar($client);
}

$v_calendarId_primary = "USER_CHOSEN@email.com";

$service = buildService($v_calendarId_primary);

$calendarId = 'primary';
$optParams = array(
  'maxResults' => 10,
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('c'),
);

$results = $service->events->listEvents($v_calendarId_primary, $optParams);

if (count($results->getItems()) == 0) {
  print "No upcoming events found.\n<br>";
} else {
  print "Upcoming events:\n<br>";
  foreach ($results->getItems() as $event) {
    $start = $event->start->dateTime;
    if (empty($start)) {
      $start = $event->start->date;
    }
    printf("%s (%s)\n <br>", $event->getSummary(), $start);
  }
}