簡體   English   中英

google oauth2使用user@gmail.com模擬服務帳戶

[英]google oauth2 impersonate service account with user@gmail.com

我想訪問一些Google API服務:

  • GDrive API
  • 聯系API
  • 人物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帖子中都沒有:

  • 是否真的可以用普通的user@gmail.com用戶模擬服務帳戶(我的意思是普通的gmail帳戶,無法訪問“將域范圍的權限委派給服務帳戶”一章中提到的管理控制台,自己的域)?

有人說是,有人說不。 那么什么是絕對真理?

據我在閱讀google文檔時所了解的:僅當您負責自己的域並且您需要注冊自己的域的Google工作帳戶時,該服務帳戶才能模擬用戶。 然后,您可以訪問管理控制台,並可以授予對服務帳戶的訪問權限。

感謝您的耐心配合和寶貴的回答時間。

最好的問候馬特

簡短的答案是“否”,無法對@ gmail.com帳戶進行模擬服務帳戶。 關鍵原因是,盡管服務帳戶OAuth流程不涉及授權屏幕,但最終還是必須有人說“我授權此應用程序來模擬該用戶”。

如果是Google Apps域,則該人是域管理員,他有權為域中的所有用戶批准應用。 對於@ gmail.com帳戶,沒有其他機構可以代表您批准該帳戶。 而且,無論如何,如果您必須要詢問用戶授權,那么使用常規的三足式OAuth流來提示用戶進行授權,獲取刷新令牌等都是有意義的。

現在有一段時間,您可以使用一個技巧,讓@ gmail.com用戶通過常規的三足流程進行操作,一旦他們批准,便可以使用此服務帳戶流程。 但是,這會導致一些奇怪的問題,因此我們禁用了該選項。 這可能就是為什么在過去可能存在分歧的原因。

暫無
暫無

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

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