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);
}
}