如何使用access_token为服务帐户发出API请求

时间:2013-03-02 01:19:12

标签: ruby-on-rails google-places-api service-accounts

我的最终目标是能够从Google's API检索地点详情。

我需要以Service Account的身份执行此操作,因为这会在我的服务器上作为后台任务启动。服务帐户需要to exchange a JWT(JSON Web Token)来访问access_token。我终于得到了工作,并收到了access_token。呼。

然而,现在我不知道如何处理这个access_token。

Place Details 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}

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

更新1

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

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

{
  :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
}

看起来很明智。

2 个答案:

答案 0 :(得分:0)

创建服务帐户及其凭据

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

•客户ID。

•私钥文件。

•电子邮件地址。

为此,首先需要启用Google Calendar API的Google API控制台项目。请按照以下步骤操作:

  1. 转到Google API控制台。
  2. 打开现有项目或创建新项目。
  3. 转到“服务”部分。
  4. 启用Calendar API(以及可能需要访问的其他API)。
  5. 您现在可以创建服务帐户及其凭据。请按照以下步骤操作:

    1. 转到API访问部分。

    2. 点击创建OAuth 2.0客户端ID ...

    3. 创建客户端ID
    4. 输入产品名称,指定可选徽标,然后单击“下一步”。

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

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

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

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

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

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

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

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

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

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

      5. 单击“授权”按钮。

      6. 您的服务帐户现在可以为您域中的所有用户提供对Google Calendar API的域范围内访问权限,也可能包含您在上述示例中列出的其他API。

        以下是使用服务帐户访问PHP中的日历数据的说明

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

        •创建Google客户端

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

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

        •如果Access令牌已过期,则设置JWT断言凭据并获取新令牌

        •设置客户端ID

        •根据Google客户端

        创建新的日历服务对象

        •检索日历事件

        注意:您必须保存Access令牌,并且只有在它即将到期时才刷新它,否则您将收到一个错误,表明您已经超过了用户在一段时间内访问令牌数量的限制。

        使用的Google PHP客户端库函数说明:

        客户端对象可以访问许多参数和方法,通过客户端对象访问以下所有内容:

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

        $client = new Google_Client();
        

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

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

        如果您已经保存了一个客户端访问令牌,请设置它:

        $client->setAccessToken($myAccessToken);
        

        检查Access令牌是否已过期,有30秒缓冲区,因此如果令牌设置为在30秒或更短时间内到期,则返回true。 Access令牌的生命周期为一小时。 Access令牌实际上是一个JSON对象,它包含创建时间,以秒为单位的生命周期以及令牌本身。因此,没有给Google打电话,因为令牌在本地拥有所有信息以确定它何时到期。

        $client->isAccessTokenExpired();
        

        如果令牌已过期或您从未检索过令牌,那么您需要设置断言凭据才能获得访问令牌:

        $ client-> 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:’abcd1234567890@developer.gserviceaccount.com’
        

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

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

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

        设置客户端ID:      $客户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&# 39;,' 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 = $客户端 - > getAccessToken();

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

答案 1 :(得分: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请求一起在http授权标头中发送。对于日历请求,它看起来如下所示: GET / calendar / v3 / calendars / primary HTTP / 1.1 主持人:www.googleapis.com 内容长度:0 授权:OAuth ya29.AHES6ZTY56eJ0LLHz3U7wc-AgoKz0CXg6OSU7wQA