[英]google oauth2 impersonate service account with user@gmail.com
我想訪問一些Google API服務:
而且,我正在努力使用oauth2模擬服務帳戶流程(您知道一個: Google Oauth v2- 服務帳戶說明 。要進行模擬,您需要在google應用程序控制台中應用“委派整個域的權限”,請下載相應的pk12文件並在Google控制台項目中激活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("myserviceuser@xxxxxx.iam.account.com")
.setServiceAccountPrivateKeyFromP12File(new File("somep12key.p12"))
.setServiceAccountScopes(scopes)
.setServiceAccountUser("my_user_name@gmail.com")
.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);
我還通過stackoverflow進行了大量搜索(無法列出所有引用並檢查響應和解決方案)。 但是從來沒有一個人清楚地回答過一個問題-在Google documentaiont或所有stackoverflow帖子中都沒有:
有人說是,有人說不。 那么什么是絕對真理?
據我在閱讀google文檔時所了解的:僅當您負責自己的域並且您需要注冊自己的域的Google工作帳戶時,該服務帳戶才能模擬用戶。 然后,您可以訪問管理控制台,並可以授予對服務帳戶的訪問權限。
感謝您的耐心配合和寶貴的回答時間。
最好的問候馬特
簡短的答案是“否”,無法對@ gmail.com帳戶進行模擬服務帳戶。 關鍵原因是,盡管服務帳戶OAuth流程不涉及授權屏幕,但最終還是必須有人說“我授權此應用程序來模擬該用戶”。
如果是Google Apps域,則該人是域管理員,他有權為域中的所有用戶批准應用。 對於@ gmail.com帳戶,沒有其他機構可以代表您批准該帳戶。 而且,無論如何,如果您必須要詢問用戶授權,那么使用常規的三足式OAuth流來提示用戶進行授權,獲取刷新令牌等都是有意義的。
現在有一段時間,您可以使用一個技巧,讓@ gmail.com用戶通過常規的三足流程進行操作,一旦他們批准,便可以使用此服務帳戶流程。 但是,這會導致一些奇怪的問題,因此我們禁用了該選項。 這可能就是為什么在過去可能存在分歧的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.