5

我目前通過OAuth 2.0和所謂的服務帳戶執行訪問谷歌聯繫人。該服務帳戶是爲「[email protected]」等普通用戶生成的。通過OAuth 2.0又名服務的私有密鑰訪問谷歌聯繫人API帳戶

的代碼來生成OAuth 2.0憑據是:

public static GoogleCredential getCredentials() throws GeneralSecurityException, IOException { 
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId(SingleUserCredentials.SERVICE_ACCOUNT_EMAIL) 
      .setServiceAccountScopes("https://www.google.com/m8/feeds") 
      .setServiceAccountPrivateKeyFromP12File(new File(SingleUserCredentials.SERVICE_ACCOUNT_PKCS12_FILE_PATH)) 
      .build(); 
    credential.refreshToken(); 
    return credential; 
} 

我再試圖檢索通過聯繫人:

ContactsService myService = new ContactsService(
      "myApp"); 

    myService.setOAuth2Credentials(getCredentials()); 

    URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
    Query myQuery = new Query(feedUrl); 
    ContactFeed resultFeed = myService.query(myQuery, ContactFeed.class); 
    // Print the results 

    for (ContactEntry entry : resultFeed.getEntries()) { 
     System.out.println(entry.getName().getFullName().getValue()); 
     System.out.println("Updated on: " + entry.getUpdated().toStringRfc822()); 
    } 

的問題是,我沒有得到任何一個單一的接觸從我的帳戶。 Feed始終爲空。沒有錯誤。沒有。

在訪問谷歌企業應用套件通過它很好地工作同樣的方法管理域。

我想知道在使用p12密鑰文件和服務帳戶時,聯繫人Api是否支持普通(又名@ gmail.com)帳戶的OAuth 2.0。

回答

1

我遇到了同樣的問題我自己。

我都嘗試,我收到的電子郵件地址時,我設置了密鑰和域管理員的電子郵件地址。

當我使用密鑰設置中的電子郵件時,我什麼也沒收到 - 沒有警告,沒有例外,也沒有數據。

當我使用域管理員的電子郵件地址,我收到一個異常:

com.google.api.client.auth.oauth2.TokenResponseException: 400 OK 
    [java] { 
    [java] "error" : "invalid_grant" 
    [java] } 
    [java] Feb 5, 2013 5:16:48 PM com.google.appengine.repackaged.org.apache.http.impl.client.DefaultRequestDirector handleResponse 
    [java] WARNING: Authentication error: Unable to respond to any of these challenges: {} 
    [java] Feb 5, 2013 5:16:48 PM com.google.apphosting.utils.jetty.JettyLogger warn 
    [java] WARNING:/
    [java] java.lang.NullPointerException: No authentication header information 

...

所以,我計算過,域管理員的電子郵件地址是我需要的不是。

接下來,我用Google搜索了一段時間發現此頁面之前:

http://javadoc.google-api-java-client.googlecode.com/hg/1.13.2-beta/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.html

我看到有getServiceAccountUser()。該字段的描述爲:

返回應用程序試圖在服務帳戶流程中模擬的用戶的電子郵件地址,如果不使用服務帳戶流程,則返回null。

當然,還有一個相應的setServiceAccountUser(String),它接受您使用服務帳戶模擬的用戶的用戶名(電子郵件地址)。

我是字段設置爲一個適當的值,我能夠繼續。

回想起來,這一切都是有道理的 - 如果我沒有提供我正在努力工作的帳戶,我無法爲該帳戶取消聯繫。

+0

嗨匿名,謝謝你的回答。但是,您正在描述基於密鑰的OAuth 2.0訪問域的方法。如上所述,這對我來說很好。我真正想要的是通過像[email protected]這樣的普通用戶訪問聯繫人的解決方案 - 沒有谷歌管理域。我希望我的問題在這方面是有道理的。 –

0

目前無法使用服務帳戶訪問聯繫人,因爲Google APIs Console不支持Google APIs Console

參見:Service Accounts

其次,它只會用谷歌管理領域工作,因爲該域的管理員必須通過以下流程授予訪問權限的服務帳戶:

代表域範圍授權給您的服務帳戶

您現在創建的服務帳戶需要被授予對您要訪問的Google Apps網域用戶數據的訪問權限。以下任務必須由Google Apps域的管理員執行:

  1. 轉到您的Google Apps網域的控制面板。該網址應如下所示:「www.google.com/a/cpanel/mydomain.com」

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

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

  4. 在一個或多個API範圍字段中,輸入您的應用程序應被授予訪問權限的範圍列表。

  5. 單擊授權按鈕。

+0

不知道我是否同意。聯繫人API在域的API控制檯中不可用 - 但它適用於域。所以理論上這也應該在常規的Gmail賬戶上工作。關於服務賬戶 - 這個概念適用於單一賬戶。我們使用Calendar Api和Drive對其進行了測試。最後 - 真奇怪的是,我們沒有收到任何失敗信息。我們只收到任何數據。看起來更像是一個錯誤? –

+0

我在找到這個答案之前嘗試了這種方法,但對我來說它不起作用。我正在使用 - 作爲示波器 - 「https:// www.google.com/m8/feeds」(聯繫人R/W),但沒有快樂。我注意到服務的範圍得到「確認」,並且他們友好的名字顯示在URI的旁邊,但這不會發生在上面的情況。我懷疑它只是不受支持。 – mac

+0

@mac我和這個URL沒有被識別一樣。但是,如果您在最後添加斜線,它會被識別。 (沒有運氣,實際上調用API雖然...) – Geert

0

我經歷了這個非常相同的錯誤運行今天,但現在已經放棄使用服務帳戶進行,我認爲目前不支持在聯繫人API。因此,我正在使用Contacts API v3與OAuth 1.0並獲得預期的結果。

ContactsService contactsService = new ContactsService(APPLICATION_NAME); 
contactsService.setUserCredentials(CLIENT_USERNAME, CLIENT_SECRET); 

URL contactFeedURL = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
Query contactFeedQuery = new Query(contactFeedURL); 

ContactFeed contactFeed = contactsService.getFeed(contactFeedQuery, ContactFeed.class); 
+0

謝謝:)很高興知道。 OAuth 1.0也適用於我們。 OAuth 2.0仍然不能與p12證書一起使用... –

+0

希望它能很快得到支持。我知道這並沒有回答你的問題,但我認爲這對於想要聯繫起來並運行的人來說可能是有用的。 – rposky

相關問題