2013-03-02 80 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

相關問題