簡體   English   中英

如何使用服務帳戶的access_token發出API請求

[英]How to make API requests with an access_token for a Service Account

我的最終目標是能夠從Google的API中檢索地點的詳細信息。

我需要以“ 服務帳戶”的身份進行此操作,因為這是我服務器上作為后台任務啟動的。 服務帳戶要求您將JWT (JSON Web令牌) 交換為access_token。 我終於得到了工作,並收到了一個access_token。 ew

但是現在,我不知道如何處理此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
}

在我看來理智。

創建服務帳戶及其憑據

您需要創建一個服務帳戶及其憑據。 在此過程中,您需要收集三個項目,以后將用於Google Apps域范圍內的授權,並在您的代碼中用於使用服務帳戶進行授權。 這三個項目是您的服務帳戶:

•客戶端ID。

•私鑰文件。

• 電子郵件地址。

為此,您首先需要一個啟用了Google Calendar 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域的控制面板。 該網址應類似於:www.google.com/a/cpanel/mydomain.com

  2. 轉到高級工具...>管理第三方OAuth客戶端訪問。

  3. 在客戶名稱字段中,輸入服務帳戶的客戶ID。

  4. 在“一個或多個API范圍”字段中,輸入應授予您的應用程序訪問權限的范圍列表(請參見下圖)。 例如,如果您需要在域范圍內訪問Google Calendar API,請輸入:www.googleapis.com/auth/calendar.readonly

  5. 單擊授權按鈕。

現在,您的服務帳戶可以為您域中的所有用戶在整個域范圍內訪問Google Calendar API,並可能在上例中列出您所列出的其他API。

以下是使用服務帳戶訪問PHP中的日歷數據的說明

服務帳戶訪問用戶日歷的一般過程如下:

•創建Google客戶端

•設置客戶端應用程序名稱

•如果您已經具有訪問令牌,請檢查它是否已過期

•如果訪問令牌已過期,則設置JWT斷言憑據並獲取新令牌

•設置客戶端ID

•基於Google客戶端創建新的日歷服務對象

•檢索日歷事件

注意:您必須保存訪問令牌,並且僅在訪問令牌即將到期時刷新它,否則您將收到一個錯誤,表明您超出了用戶在一段時間內訪問令牌的數量限制。

使用的Google PHP客戶端庫功能的說明:

客戶端對象可以訪問許多參數和方法,通過客戶端對象可以訪問以下所有內容:

創建一個新的客戶端對象:

$client = new Google_Client();

設置客戶端應用程序名稱:

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

如果您已經保存了一個客戶端訪問令牌,請設置它:

$client->setAccessToken($myAccessToken);

檢查訪問令牌是否已過期,是否有30秒的緩沖區,因此如果令牌設置為在30秒或更短時間內過期,則它將返回true。 訪問令牌的生命周期為一小時。 Access令牌實際上是一個JSON對象,其中包含創建時間,生存時間(以秒為單位)以及令牌本身。 因此,不會調用Google,因為令牌在本地具有所有信息來確定令牌何時到期。

$client->isAccessTokenExpired();

如果令牌已過期,或者您從未檢索過令牌,則需要設置斷言憑據才能獲取訪問令牌:

$ client-> setAssertionCredentials(新的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控制台中創建項目時下載的密鑰文件的內容。 $ 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();

下次將訪問令牌保存到永久存儲中。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM