2016-09-15 58 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

相关问题