谷歌的oauth2模仿与[email protected]
服务帐户,我想访问一些谷歌的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帐户没有访问提到的管理控制台的章节“委托域服务帐户的权限”和没有自己的域)?
有的说是,有的说不。那么,绝对的真相是什么?
据我了解当阅读谷歌文档时:服务帐户只能模拟用户当你负责自己的域名,你需要有一个谷歌工作帐户与自己的域名注册。然后,您可以访问管理控制台并授予对该服务帐户的访问权限。
感谢您的耐心等待和时间回答。
问候 马特
简短的回答是否定的,这是不可能执行@ gmail.com帐户的服务帐户冒充。关键的原因是,虽然服务帐户OAuth流程不涉及授权屏幕,但在某天结束时,仍有人必须说“我授权此应用程序模拟此用户”。
对于Google Apps域,该人员是域管理员,他有权批准域中所有用户的应用。对于@ gmail.com帐户,没有其他权威机构可以代表您进行审批。如果您必须要求用户授权,那么使用常规的三段式OAuth流程来提示用户进行授权,获取刷新令牌等是合理的。
现在有一段时间了这是一种伎俩,你可以通过普通的三段式流程获得@ gmail.com用户,一旦他们批准它,就可以使用服务帐户流。这会导致一些奇怪的问题,所以我们禁用了该选项。这可能就是为什么过去有关于这是否可能的分歧。
嗨,埃里克感谢您的澄清。 Google是否可以使用如下语句更新OAuth文档:“仅使用Gmail帐户模拟服务帐户并且没有在Google注册域名是不可能的。”?我不想使用你提到的技巧(被劫持的三脚OAuth)。这是邪恶的。 – samatthias
是否真的有可能模仿serviceaccount。怀疑它可能回来了,当我们有客户端登录。我从来没有与Oauth合作过。令我印象深刻的是,您可以混合发现apis和gdata apis,这不容易:) – DaImTo
作为进一步的输入,我只能说上面的代码是大量尝试错误和stackoverflow解决方案的混合体。我的代码中断位于“credential.refreshToken();”行所以我想我无法获得授权的新令牌。是的,你是对的,它是gdata和发现apis的混合物..但这不是重点。除非您拥有正确且正在运行的oauth凭证设置,否则您可以将所需的任何服务(People API,Gdrive API,...) – samatthias
你不应该需要这个服务帐户。注意:我不是一个java程序员。 – DaImTo