php - 允许我的用户使用带有 PHP 的 Google Calendar API 在我的日历中添加会议,而无需身份验证
问题描述
我正在开发一个应用程序,该应用程序允许我的用户使用我的一个 Google 日历来安排/重新安排日历活动,我不需要用户通过 Google 进行身份验证。我需要使用的是带有服务帐户的 Google Calendar API。
我试图用 api v2 写一些东西,但我遇到了问题,所以我想知道你是否可以指导我看一个教程或一个例子,或者只是一个插入的例子
<?php
require_once './google-api-php-client-2.2.2/vendor/autoload.php';
session_start();
/************************************************ */
$client_id = '751416246659ae431430560098c25ba433c3e483';
$Email_address = ' testecalendar@spartan-grail-241202.iam.gserviceaccount.com';
$key_file_location = './credentials.json';
$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$key = file_get_contents($key_file_location);
// separate additional scopes with a comma
$scopes = "https://www.googleapis.com/auth/calendar.readonly";
$client->setAuthConfig('./credentials.json');
$service = new Google_Service_Calendar($client);
?>
<html>
<body>
<?php
$calendarList = $service->calendarList->listCalendarList();
while (true) {
foreach ($calendarList->getItems() as $calendarListEntry) {
echo $calendarListEntry->getSummary() . "<br>\n";
// get events
$events = $service->events->listEvents($calendarListEntry->id);
foreach ($events->getItems() as $event) {
echo "-----" . $event->getSummary() . "<br>";
}
}
$pageToken = $calendarList->getNextPageToken();
if ($pageToken) {
$optParams = array('pageToken' => $pageToken);
$calendarList = $service->calendarList->listCalendarList($optParams);
} else {
break;
}
}
?>
我收到了这个错误:
致命错误:未捕获的 Google_Service_Exception:{“error”:{“errors”:[{“domain”:“global”、“reason”:“required”、“message”:“需要登录”、“locationType”:“header” ,“位置”:“授权”}],“代码”:401,“消息”:“需要登录”}}在/Users/macbook/Desktop/testcal/google-api-php-client-2.2.2/src /Google/Http/REST.php:118 堆栈跟踪:#0 /Users/macbook/Desktop/testcal/google-api-php-client-2.2.2/src/Google/Http/REST.php(94): Google_Http_REST ::decodeHttpResponse(对象(GuzzleHttp\Psr7\Response),对象(GuzzleHttp\Psr7\Request),'Google_Service_...')#1 /Users/macbook/Desktop/testcal/google-api-php-client-2.2。 2/src/Google/Task/Runner.php(176): Google_Http_REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...') #2 /Users/macbook/Desktop/testcal/google-api-php-client-2.2.2/src/ Google/Http/REST.php(58): Google_Task_Runner->run() #3 /Users/macbook/Desktop/testcal/google-api-php-client-2.2.2/src/Google/Client.php(798) :第 118 行 /Users/macbook/Desktop/testcal/google-api-php-client-2.2.2/src/Google/Http/REST.php 中的 Google_Http_RES
解决方案
未经用户同意屏幕从 PHP 应用程序访问 Google Calendar API
不确定你是否真的想经历这一切(这只是一次:-)),但你去吧……
“服务帐户是一种特殊类型的 Google 帐户,旨在代表需要进行身份验证并被授权访问 Google API 中的数据的非人类用户。”
这个想法是使用“服务帐户”(电子邮件地址)授权/共享您的日历,并使用“服务帐户密钥”进行身份验证。
我将从代码开始:
<?php
// read google calendar from php command line application
require_once './google-api-php-client-2.2.3/vendor/autoload.php';
$client = new Google_Client();
$client->addScope("https://www.googleapis.com/auth/calendar.readonly");
$client->setAuthConfig('client_credentials.json');
$service = new Google_Service_Calendar($client);
$calendarList = $service->calendarList->listCalendarList();
while(true) {
foreach ($calendarList->getItems() as $calendarListEntry) {
echo $calendarListEntry->getSummary();
echo "\n------------------------------\n\n";
// get events
$events = $service->events->listEvents($calendarListEntry->id);
foreach ($events->getItems() as $event) {
echo "- " . $event->getSummary() . "\n";
echo "- " . $event->getStart()->getDateTime() . "\n\n";
}
}
$pageToken = $calendarList->getNextPageToken();
if ($pageToken) {
$optParams = array('pageToken' => $pageToken);
$calendarList = $service->calendarList->listCalendarList($optParams);
} else {
break;
}
}
如何使其工作:
从这个仓库(https://github.com/googleapis/google-api-php-client/releases)
下载“google-api-php-client-2.2.3.zip”并解压缩“google-api-php-client -2.2.3" 在您的 php 应用程序的根目录中。
接下来,您需要这个“client_credentials.json”文件。你会从“谷歌云平台”得到它。最好是创建一个新项目,您可以使用现有项目,但您可能无法得到我在下面描述的内容(您可能能够做到,本质是一样的)。
创建并选择一个新项目后,
- 转到“APIs & Services” > “Library”
- 搜索“Calendar”,然后选择“Google Calendar API”
- 启用
接下来,您需要“创建凭据”
-如果您尚未重定向,请转到“API 和服务”>“凭据”
-单击“创建凭据”>“帮助我选择”
-他们会问您“哪个 API你在使用”,选择“Google Calendar API”
——接下来,他们会问你“你将从哪里调用 API?”,选择“其他 UI(例如 Windows、CLI 工具)”
——接下来,他们会问您“您将访问哪些数据?”,选择“应用程序数据”
- 接下来,单击“我需要哪些凭据?”
现在您在“向您的项目添加凭据”页面
- 填写“服务帐户名称”
- 选择“项目”>“编辑器”的“角色”
- “密钥类型”应该是“JSON”
- 单击“继续”然后你'将被提示下载这个“something-something.json”文件(你可以将它保存在你的 php 应用程序的根目录中)
接下来,在您的 php 应用程序文件夹中,将“something-something.json”重命名为“client_credentials.json”
差不多好了...
接下来,使用文本编辑器打开“client_credentials.json”
- 复制作为“client_email”值的电子邮件地址,例如“test-php-app@xxxxxxxxxx-nnnnnnnnnnnnn.iam.gserviceaccount.com”
接下来,转到您的日历(您要访问的 Google 日历)并转到“设置”>“日历设置”
-向下滚动到“与特定人员共享”(您会在列表中看到自己)
-单击“+ 添加人员”并粘贴电子邮件地址,例如“test-php-app@xxxxxxxxxx-nnnnnnnnnnnnnn.iam.gserviceaccount.com”
-选择您想要的“权限”
-单击“发送”按钮
现在您的 php 应用程序通过服务帐户可以访问您的日历。
这是显示日历ID的代码:
echo "calendar summary: " . $calendarListEntry->getSummary();
echo "\ncalendar id: " . $calendarListEntry->getId();
echo "\n------------------------------\n\n";
推荐阅读
- python - ValueError: Argument must be a dense tensor...形状为 [80, 3, 8, 8],但想要 [80] 与 estimator.predict
- javascript - 无法下载节点模块?
- mongodb - MongoDB“空”或 NULL 日期
- reactjs - 使用类型化的 Props 连接组件
- python - 执行中出现此错误的原因是什么?
- python - 是否有用于种子白噪声的 python 函数?
- flutter - 在 Flutter 的底部表单中创建下拉菜单
- postgresql - pg_dump --clean 失败取决于 --format
- c++ - 银行模拟的无限循环
- javascript - 比较两个对象以获得匹配的元素