2016-09-15 57 views
2

服務帳戶,我想訪問一些谷歌的API服務:谷歌的oauth2模仿與[email protected]

  • GDrive的API
  • 聯繫API
  • 人民API

而且我使用oauth2模擬服務帳戶流程(您知道一個:Google Oauth v2 - service account description。對於模仿,您需要在Google應用程序控制臺中應用「委託域範圍的權限」,請下載t他相應pk12文件並在谷歌控制檯項目中激活api。

目前,我總是得到:

com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized 
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105) 
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287) 
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307) 
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384) 
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489) 
at oauthsample.GDriveAPI.<init>(GDriveAPI.java:50) 
at oauthsample.GDriveAPI.main(GDriveAPI.java:85) 

這裏是我的代碼:

 HttpTransport httpTransport = new NetHttpTransport(); 
     JacksonFactory jsonFactory = new JacksonFactory();  

     Set<String> scopes = new HashSet<String>(); 
     scopes.add("https://www.google.com/m8/feeds"); 

     GoogleCredential credential = new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId("[email protected]") 
       .setServiceAccountPrivateKeyFromP12File(new File("somep12key.p12")) 
       .setServiceAccountScopes(scopes) 
       .setServiceAccountUser("[email protected]") 
       .build(); 

     credential.refreshToken(); 
     ContactsService service = new ContactsService("MYAPP"); 
     service.getRequestFactory().setHeader("User-Agent", "MYAPP"); 
     service.setHeader("GData-Version", "3.0"); 
     service.setOAuth2Credentials(credential); 

     URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
     ContactFeed resultFeed = service.getFeed(feedUrl, ContactFeed.class); 

我也搜索過重計算器(不能列出所有引用,並檢查了應對措施和解決) 。但是,有一個問題一直沒有明確答覆 - 也沒有在谷歌documentaiont也不是對所有的計算器帖子:

  • 是否真的能夠模仿與正常[email protected]用戶serviceaccount(我指的是正常的Gmail帳戶沒有訪問提到的管理控制檯的章節「委託域服務帳戶的權限」和沒有自己的域)?

有的說是,有的說不。那麼,絕對的真相是什麼?

據我瞭解當閱讀谷歌文檔時:服務帳戶只能模擬用戶當你負責自己的域名,你需要有一個谷歌工作帳戶與自己的域名註冊。然後,您可以訪問管理控制檯並授予對該服務帳戶的訪問權限。

感謝您的耐心等待和時間回答。

問候 馬特

+0

是否真的有可能模仿serviceaccount。懷疑它可能回來了,當我們有客戶端登錄。我從來沒有與Oauth合作過。令我印象深刻的是,您可以混合發現apis和gdata apis,這不容易:) – DaImTo

+0

作爲進一步的輸入,我只能說上面的代碼是大量嘗試錯誤和stackoverflow解決方案的混合體。我的代碼中斷位於「credential.refreshToken();」行所以我想我無法獲得授權的新令牌。是的,你是對的,它是gdata和發現apis的混合物..但這不是重點。除非您擁有正確且正在運行的oauth憑證設置,否則您可以將所需的任何服務(People API,Gdrive API,...) – samatthias

+0

你不應該需要這個服務帳戶。注意:我不是一個java程序員。 – DaImTo

回答

1

簡短的回答是否定的,這是不可能執行@ gmail.com帳戶的服務帳戶冒充。關鍵的原因是,雖然服務帳戶OAuth流程不涉及授權屏幕,但在某天結束時,仍有人必須說「我授權此應用程序模擬此用戶」。

對於Google Apps域,該人員是域管理員,他有權批准域中所有用戶的應用。對於@ gmail.com帳戶,沒有其他權威機構可以代表您進行審批。如果您必須要求用戶授權,那麼使用常規的三段式OAuth流程來提示用戶進行授權,獲取刷新令牌等是合理的。

現在有一段時間了這是一種伎倆,你可以通過普通的三段式流程獲得@ gmail.com用戶,一旦他們批准它,就可以使用服務帳戶流。這會導致一些奇怪的問題,所以我們禁用了該選項。這可能就是爲什麼過去有關於這是否可能的分歧。

+1

嗨,埃裏克感謝您的澄清。 Google是否可以使用如下語句更新OAuth文檔:「僅使用Gmail帳戶模擬服務帳戶並且沒有在Google註冊域名是不可能的。」?我不想使用你提到的技巧(被劫持的三腳OAuth)。這是邪惡的。 – samatthias

相關問題