首页 > 解决方案 > 允许我的用户使用带有 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

标签: phpgoogle-apigoogle-calendar-apigoogle-oauth

解决方案


未经用户同意屏幕从 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";


推荐阅读