2013-03-02 78 views
0

我的最终目标是能够从Google's API中检索地点详细信息。如何使用access_token为服务帐户创建API请求

我需要做的这是一个Service Account,因为这被踢掉我的服务器上的后台任务。服务帐户要求您为access_token提供to exchange a JWT(JSON Web令牌)。我终于得到了这个工作,并且正在接收access_token。唷。

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

地方详情API表示,key参数是必需的,但我没有钥匙。只是一个access_token。将该值用于key或将参数名称更改为access_token不起作用。

最后,我需要能够打一个网址像这样:

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

我如何使用我的访问令牌才能对谷歌将详细的API的请求?

更新1

仍然没有成功,但我想我会后我的情况下,请求的细节有什么毛病就是我提交给谷歌。

我使用的JWT Ruby library,这里是我的要求设定的值:

{ 
    :iss => "[email protected]ccount.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 
} 

看起来理智给我。

+0

你设法解决它?我在这里拉我的头发做类似的事情,但与谷歌驱动器! – wachichornia 2013-12-05 22:39:53

+0

不幸的是我没有。我努力在他们的文档中坚持Google的建议/规则,但最终将配置成Web服务器应用程序。作为服务帐户太痛苦了。它已经跑了至少8个月,我没有问题。 – djibouti33 2013-12-06 00:16:19

+0

我解决了它,我的答案在这里: http://stackoverflow.com/questions/27609138/how-to-insert-video-youtube-api-v3-through-service-account-with-ruby/27620954#27620954 享受! – dangalg 2014-12-23 13:13:45

回答

0

创建服务帐户及其凭据

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

•客户端ID。

•私人密钥文件。

•电子邮件地址。

为了做到这一点,您首先需要一个运行Google APIs Console项目并启用Google Calendar API。请执行以下步骤:

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

您现在可以创建服务帐户及其凭据。请按照下列步骤:

  1. 转至API访问部分。

  2. 通过点击创建一个OAuth 2.0客户端ID创建客户端ID ...

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

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

在这一点上,你会看到一个对话框,允许你下载私钥文件提交(见下图)。请务必安全地下载并保存该文件,因为无法从API控制台再次下载。

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

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

代表域范围内的权力,您的服务帐户

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

  1. 转到您的谷歌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为您的域的所有用户,并有可能你在上面的例子中列出的其他API。

下面是使用服务帐户来访问PHP日历数据的描述

的服务帐户访问用户日历的一般过程是如下:

•创建的谷歌客户端

•设置客户端应用程序名称

•如果您已经有Access令牌,请检查它是否已过期

•如果访问令牌到期,则设置JWT断言凭证,并得到一个新的令牌

•设置客户端ID

•创建基于谷歌客户端上的一个新的日历服务对象

•检索日历事件

注意:您必须保存Access令牌并仅在即将到期时刷新它,否则您将收到一个错误,指出您已超出一段时间内访问令牌的数量限制为用户。的谷歌PHP客户端库函数

说明使用:

客户端对象可以访问很多参数和方法都通过客户端对象进行访问以下内容:

创建一个新的客户端对象:

$client = new Google_Client(); 

设置客户端应用程序名称:

$client->setApplicationName(“My Calendar App”); 

设置客户端访问令牌,如果你已经有一个保存:

$client->setAccessToken($myAccessToken); 

检查,看是否访问令牌已过期,有30秒的缓冲,所以如果令牌被设置为过期,这将返回true在30秒以内。 Access令牌的有效期为一个小时。 Access令牌实际上是一个JSON对象,它包含创建时间,它的寿命以秒为单位,以及令牌本身。因此,Google不会向Google拨打电话,因为该令牌具有本地所有信息以确定其何时到期。

$client->isAccessTokenExpired(); 

如果令牌已过期或你从来没有检索到的令牌,那么你将需要设置断言凭据才能获得访问令牌:

$客户 - > setAssertionCredentials(新Google_AssertionCredentials(SERVICE_ACCOUNT_NAME ,数组(CALENDAR_SCOPE),$ key,'notasecret','http://oauth.net/grant_type/jwt/1.0/bearer',$ email_add));

Where: 

SERVICE_ACCOUNT_NAME是之前设置的服务帐户电子邮件地址。

For example:’[email protected]

CALENDAR_SCOPE是Google管理界面中的范围设置。

For example: ‘https://www.googleapis.com/auth/calendar.readonly’ 

$ key是在Google应用程序控制台中创建项目时下载的密钥文件的内容。 $ email_add是要检索日历数据的用户的Google电子邮件地址。

设置客户端ID: $ client-setClientId(SERVICE_CLIENT_ID); 其中: SERVICE_CLIENT_ID是之前设置的服务帐户客户端ID。 例如:'abcd123456780.apps.googleusercontent.com'

创建新的日历服务对象: $ 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();

将访问令牌下次保存到永久存储区。

+1

我很欣赏彻底的答案。但是,我遇到了一些问题。1)如问题中所述,我已经能够接收access_token了,现在我只需要知道如何处理它。 2)你的例子使用了一个PHP库,但这个问题被标记为“Ruby-on-rails”。谷歌的RoR客户端表示它仍然处于alpha版本,而不是使用它,所以我需要基本推出自己的客户端。我不知道如何将我的请求中的access_token传递给Places API,这就是我需要帮助的。 – djibouti33 2013-03-05 22:32:35

+0

也详细说明了如何连接到用户的Google Apps数据。我只是想使用服务帐户连接到Places API。那可能吗? – djibouti33 2013-03-05 23:22:52

0

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

只要使用该标记,请查看https://code.google.com/p/google-api-ruby-client/代码,因为在代码存储库中明确定义了该用法。如果访问令牌用于服务帐户或单个用户,使用令牌的过程相同,则不会有任何区别。请参阅下面的链接标题为“调用谷歌API”一节:https://developers.google.com/accounts/docs/OAuth2InstalledApp

访问令牌在HTTP授权头发送随着request.For日历请求时,它看起来像以下: GET /日历/ V3 /日历/主HTTP/1.1 主持人:www.googleapis.com 内容长度:0 授权:OAuth的ya29.AHES6ZTY56eJ0LLHz3U7wc-AgoKz0CXg6OSU7wQA

相关问题