创建服务帐户及其凭据
您需要创建一个服务帐户及其凭据。在此过程中,您需要收集三个项目,这些项目稍后将用于 Google Apps 域范围的授权,并在您的代码中使用您的服务帐户进行授权。这三个项目是您的服务帐户:
• 客户 ID。
• 私钥文件。
• 电子邮件地址。
为此,您首先需要一个启用了 Google 日历 API 的有效 Google API 控制台项目。按着这些次序:
- 转到 Google API 控制台。
- 打开您现有的项目或创建一个新项目。
- 转到服务部分。
- 启用日历 API(以及您可能需要访问的其他 API)。
您现在可以创建服务帐户及其凭据。按着这些次序:
转到 API 访问部分。
通过单击创建 OAuth 2.0 客户端 ID... 创建客户端 ID
输入产品名称,指定可选徽标,然后单击下一步。
在询问您的应用程序类型时选择服务帐户,然后单击创建客户端 ID。
此时,您将看到一个对话框,允许您将私钥作为文件下载(见下图)。确保下载并安全地保存该文件,因为无法从 API 控制台再次下载它。
下载文件并关闭对话框后,您将能够获取服务帐户的电子邮件地址和客户端 ID。
您现在应该已经收集了您的服务帐户的私钥文件、客户 ID 和电子邮件地址。您已准备好将域范围的权限委派给您的服务帐户。
将域范围的权限委派给您的服务帐户
您现在创建的服务帐户需要被授予访问您要访问的 Google Apps 域的用户数据的权限。以下任务必须由 Google Apps 域的管理员执行:
转到您的 Google Apps 域的控制面板。URL 应如下所示:www.google.com/a/cpanel/mydomain.com
转到高级工具... > 管理第三方 OAuth 客户端访问。
在客户端名称字段中输入服务帐户的客户端 ID。
在一个或多个 API 范围字段中,输入应授予您的应用程序访问权限的范围列表(见下图)。例如,如果您需要对 Google Calendar API 进行域范围的访问,请输入:www.googleapis.com/auth/calendar.readonly
单击授权按钮。
您的服务帐户现在可以为您域中的所有用户以及您在上面的示例中列出的其他 API 提供域范围内的 Google Calendar API 访问权限。
下面是使用服务帐户访问 PHP 中的日历数据的描述
服务帐户访问用户日历的一般流程如下:
• 创建 Google 客户端
• 设置客户端应用程序名称
• 如果您已有访问令牌,请检查它是否已过期
• 如果访问令牌已过期,则设置 JWT 断言凭据并获取新令牌
• 设置客户端 ID
• 基于谷歌客户端新建日历服务对象
• 检索日历事件
注意:您必须保存访问令牌并仅在它即将到期时刷新它,否则您将收到错误消息,指出您已超出用户在一段时间内的访问令牌数量限制。
使用的 Google PHP Client 库函数说明:
客户端对象可以访问许多参数和方法,以下所有这些都是通过客户端对象访问的:
创建一个新的客户端对象:
$client = new Google_Client();
设置客户端应用程序名称:
$client->setApplicationName(“My Calendar App”);
如果您已经保存了一个客户端访问令牌,请设置:
$client->setAccessToken($myAccessToken);
检查访问令牌是否已过期,有一个 30 秒的缓冲区,因此如果令牌设置为在 30 秒或更短的时间内过期,这将返回 true。访问令牌的生命周期为一小时。访问令牌实际上是一个 JSON 对象,其中包含创建时间、以秒为单位的生命周期以及令牌本身。因此,不会调用 Google,因为令牌在本地拥有所有信息以确定它何时到期。
$client->isAccessTokenExpired();
如果令牌已过期或您从未检索过令牌,那么您将需要设置断言凭据以获取访问令牌:
$client->setAssertionCredentials(new Google_AssertionCredentials(SERVICE_ACCOUNT_NAME,array(CALENDAR_SCOPE), $key,'notasecret',' http://oauth.net/grant_type/jwt/1.0/bearer ',$email_add));
Where:
SERVICE_ACCOUNT_NAME 是之前设置的服务帐户电子邮件地址。
For example:’abcd1234567890@developer.gserviceaccount.com’
CALENDAR_SCOPE 是 Google 管理界面中的范围设置。
For example: ‘https://www.googleapis.com/auth/calendar.readonly’
$key 是您在 Google Apps Console 中创建项目时下载的密钥文件的内容。$email_add 是您要为其检索日历数据的用户的 Google 电子邮件地址。
设置客户端ID:$client-setClientId(SERVICE_CLIENT_ID); 其中:SERVICE_CLIENT_ID 是之前设置的服务帐户客户端 ID。例如:'abcd123456780.apps.googleusercontent.com'</p>
创建一个新的日历服务对象: $cal = new Google_CalendarService($client);
日历检索可以设置几个选项我在下面的代码中设置了几个选项,它们在api文档中定义。$optEvents = array('timeMax' => $TimeMax, 'timeMin' => $TimeMin, 'orderBy' => 'startTime', 'singleEvents' => 'True');
获取日历事件列表并将上述选项传递给调用:
$calEvents = $cal->events->listEvents('primary', $optEvents);
遍历返回的事件列表,列表是分页的,所以我们需要获取页面,直到列表用完:
foreach ($calEvents->getItems() as $event) {
// get event data
$Summary = $event->getSummary();
$description = $event->getDescription();
$pageToken = $calEvents->getNextPageToken();
if ($pageToken) { // if we got a token the fetch the next page of events.
$optParams = array('pageToken' => $pageToken);
$calEvents = $cal->events->listEvents('primary', $optParams);
} else {
break;
}
}
获取访问令牌:
$myAccessToken=$client->getAccessToken();
下次将访问令牌保存到您的永久存储中。