google oauth2使用user@gmail.com模拟服务帐户

我想访问一些谷歌API服务:

  • GDrive API
  • 联系API
  • People API

我正在努力使用oauth2模拟服务帐户流程(您知道其中一个: Google Oauth v2 – 服务帐户说明 。要进行模拟,您需要在Google Apps控制台中应用“委派域范围权限”,下载对应的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.(GDriveAPI.java:50) at oauthsample.GDriveAPI.main(GDriveAPI.java:85) 

这是我的代码:

  HttpTransport httpTransport = new NetHttpTransport(); JacksonFactory jsonFactory = new JacksonFactory(); Set scopes = new HashSet(); 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进行了大量搜索(无法列出所有引用并检查响应和解决方案)。 但有一个问题从来没有得到明确回答 – 谷歌文件也没有,也没有在所有的stackoverflowpost上:

  • 是否真的可以使用普通的user@gmail.com用户模拟serviceaccount(我的意思是在“将域范围的权限委派给服务帐户”一章中无法访问上述管理控制台的普通Gmail帐户,并且没有自己的域名)?

有人说是,有些人说不。 那么绝对真理是什么?

据我所知,在阅读谷歌文档时:服务帐户只能在您负责自己的域名时冒充用户,并且您需要拥有自己域名注册的Google工作帐户。 然后,您就可以访问管理控制台,并可以授予对服务帐户的访问权限。

感谢您的耐心和时间回答。

最好的问候马特

简短的回答是否定的,不可能执行@ gmail.com帐户的服务帐户模拟。 关键原因是虽然服务帐户OAuth流程不涉及授权屏幕,但在一天结束时,某人仍必须说“我授权此应用程序模拟此用户”。

对于Google Apps域,该用户是域管理员,有权批准域中所有用户的应用。 对于@ gmail.com帐户,没有其他权限可以代表您批准此问题。 如果你不得不要求用户进行授权,那么使用常规的3脚OAuth流来提示用户授权,获取刷新令牌等是有意义的。

现在有一段时间有一个技巧,你可以通过常规的3脚流程采取@ gmail.com用户,一旦他们批准它,从那时起使用服务帐户流程。 这会导致一些奇怪的问题,所以我们禁用了该选项。 这可能就是为什么过去存在分歧,如果可能的话。