【问题标题】:How to make API requests with an access_token for a Service Account如何使用服务帐户的 access_token 发出 API 请求
【发布时间】:2013-03-02 01:19:12
【问题描述】:

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

我需要以Service Account 的身份执行此操作,因为这是作为我服务器上的后台任务启动的。服务帐户要求您使用to exchange a 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 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
}

在我看来很正常。

【问题讨论】:

  • 你解决了吗?我在这里拉头发做类似的事情,但使用谷歌驱动器!
  • 不幸的是我没有。我试图在他们的文档中坚持谷歌的建议/规则,但最终将事物配置为 Web 服务器应用程序。作为服务帐户太痛苦了。它已经这样运行了至少 8 个月,我没有遇到任何问题。
  • 我解决了,我的答案在这里:stackoverflow.com/questions/27609138/…享受!

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


【解决方案1】:

创建服务帐号及其凭据

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

• 客户 ID。

• 私钥文件。

• 电子邮件地址。

为此,您首先需要一个启用了 Google Calendar API 的有效 Google APIs Console 项目。请按以下步骤操作:

  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 域的控制面板。该网址应如下所示: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 = 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’

创建一个新的日历服务对象: $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)如问题所述,我已经能够接收到 access_token,现在我只需要知道如何处理它。 2)您的示例使用 PHP 库,但此问题标记为“Ruby-on-rails”。谷歌的 RoR 客户端说它仍处于 alpha 阶段,不能使用它,所以我基本上需要推出自己的客户端。我不知道如何将我的请求中的 access_token 传递给 Places API,这就是我需要帮助的地方。
  • 另外,这详细说明了如何连接到用户的 Google Apps 数据。我只是想使用服务帐户连接到 Places API。这可能吗?
【解决方案2】:

语言不重要 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2013-09-10
    • 1970-01-01
    • 2016-11-21
    • 2020-10-08
    相关资源
    最近更新 更多