0

我的最终目标是能够从Google 的 API检索地点详细信息。

我需要作为Service Account执行此操作,因为这是作为我服务器上的后台任务启动的。服务帐户要求您将 JWT(JSON Web 令牌)交换为 access_token。我终于开始工作了,并且收到了一个 access_token。呸。

但是,现在我不知道如何处理这个 access_token。

Place Details API 说该key参数是必需的,但我没有密钥。只是一个access_token。使用该值key或将参数名称更改为access_token不起作用。

最终我需要能够像这样点击一个 URL:

https://maps.googleapis.com/maps/api/place/details/json?reference={MY_REFERENCE}&sensor=false&key={MY_ACCESS_TOKEN}

如何使用我的访问令牌向 Google Place Detail API 发出请求?

更新 1

仍然没有成功,但我想我会发布我的请求的详细信息,以防我提交给 Google 的内容有问题。

我正在使用JWT Ruby 库,以下是我的声明集的值:

{
  :iss => "54821520045-c8k5dhrjmiotbi9ni0salgf0f4iq5669@developer.gserviceaccount.com",
  :scope => "https://www.googleapis.com/auth/places",
  :aud => "https://accounts.google.com/o/oauth2/token",
  :exp => (Time.now + 3600),
  :iat => Time.now.to_i
}

在我看来很理智。

4

2 回答 2

0

创建服务帐户及其凭据

您需要创建一个服务帐户及其凭据。在此过程中,您需要收集三个项目,这些项目稍后将用于 Google Apps 域范围的授权,并在您的代码中使用您的服务帐户进行授权。这三个项目是您的服务帐户:

• 客户 ID。

• 私钥文件。

• 电子邮件地址。

为此,您首先需要一个启用了 Google 日历 API 的有效 Google API 控制台项目。按着这些次序:

  1. 转到 Google API 控制台。
  2. 打开您现有的项目或创建一个新项目。
  3. 转到服务部分。
  4. 启用日历 API(以及您可能需要访问的其他 API)。

您现在可以创建服务帐户及其凭据。按着这些次序:

  1. 转到 API 访问部分。

  2. 通过单击创建 OAuth 2.0 客户端 ID... 创建客户端 ID

  3. 输入产品名称,指定可选徽标,然后单击下一步。

  4. 在询问您的应用程序类型时选择服务帐户,然后单击创建客户端 ID。

此时,您将看到一个对话框,允许您将私钥作为文件下载(见下图)。确保下载并安全地保存该文件,因为无法从 API 控制台再次下载它。

下载文件并关闭对话框后,您将能够获取服务帐户的电子邮件地址和客户端 ID。

您现在应该已经收集了您的服务帐户的私钥文件、客户 ID 和电子邮件地址。您已准备好将域范围的权限委派给您的服务帐户。

将域范围的权限委派给您的服务帐户

您现在创建的服务帐户需要被授予访问您要访问的 Google Apps 域的用户数据的权限。以下任务必须由 Google Apps 域的管理员执行:

  1. 转到您的 Google Apps 域的控制面板。URL 应如下所示:www.google.com/a/cpanel/mydomain.com

  2. 转到高级工具... > 管理第三方 OAuth 客户端访问。

  3. 在客户端名称字段中输入服务帐户的客户端 ID。

  4. 在一个或多个 API 范围字段中,输入应授予您的应用程序访问权限的范围列表(见下图)。例如,如果您需要对 Google Calendar API 进行域范围的访问,请输入:www.googleapis.com/auth/calendar.readonly

  5. 单击授权按钮。

您的服务帐户现在可以为您域中的所有用户以及您在上面的示例中列出的其他 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();

下次将访问令牌保存到您的永久存储中。

于 2013-03-05T15:27:04.050 回答
0

语言不重要 php、ruby、.net、java 过程都是一样的。api 的控制台将 Places API 显示为支持服务帐户,因此应该可以访问它。

至于使用令牌,请查看https://code.google.com/p/google-api-ruby-client/代码,因为代码存储库中明确定义了用法。如果访问令牌用于服务帐户或单个用户,则没有任何区别,使用令牌的过程是相同的。请参阅以下链接中标题为“调用 Google API”的部分:https ://developers.google.com/accounts/docs/OAuth2InstalledApp

访问令牌与请求一起在 http 授权标头中发送。对于日历请求,它看起来类似于以下内容: GET /calendar/v3/calendars/primary HTTP/1.1 主机:www.googleapis.com 内容长度: 0 授权:OAuth ya29.AHES6ZTY56eJ0LLHz3U7wc-AgoKz0CXg6OSU7wQA

于 2013-03-11T16:25:53.673 回答