我正在尝试使用带有OAuth 2身份验证的Google Contacts API。但是一些旧的示例代码现在不适用于这个API。我找到了一个示例代码,它提出了访问令牌的请求,作为回应,Google服务器会给我一个约1小时限制的访问令牌和一个刷新令牌。 但是这段代码存在一些问题
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
String APPLICATION_NAME = "PROJECT_NAME";
String SERVICE_ACCOUNT_EMAIL = "NUMERCALS-ALPHANUMERICALS@developer.gserviceaccount.com";
java.io.File p12File = new java.io.File("PROJECT_NAME-NUMERICALS.p12");
GoogleCredential credential =
new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(
Collections.singleton("https://www.google.com/m8/feeds"))
.setServiceAccountPrivateKeyFromP12File(p12File)
.setServiceAccountUser("user@example.com")
.build();
if (!credential.refreshToken()) {
throw new RuntimeException("Failed OAuth to refresh the token");
}
ContactsService service = new ContactsService(APPLICATION_NAME);
service.setOAuth2Credentials(credential);
Query gQuery = new Query(new java.net.URL("https://www.google.com/m8/feeds/groups/user@example.com/full"));
gQuery.setMaxResults(32767);
ContactGroupFeed groupFeed = service.query(gQuery, ContactGroupFeed.class);
for (ContactGroupEntry group : groupFeed.getEntries()) {
我遇到了一些问题
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_grant"
}
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:269)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at javaCode.FinalCode.main(FinalCode.java:68)
我是新手,将OAuth2用于Google API,因此如果我在某处错误或提供正常工作的代码段,请引导我。这将是很好的帮助。谢谢。
答案 0 :(得分:0)
在您的示例中,您尝试使用服务帐户来模拟用户。 虽然这是可能的,但只能通过谷歌的工作或谷歌的教育帐户来实现。 它不适用于普通的Gmail帐户。
如果您的用例属于这种情况,请记住,域管理员应该授予您的应用程序访问权限,并且还应该授予Domain wide delegation of authority。
但如果您只是尝试使用API进行一些测试,那么使用普通OAuth会更好。
选中tutorial,我知道是针对云端硬盘的,但您可以看到获取授权令牌的基本步骤。获得后,对不同Google Apis的调用非常相似。
我建议查看OAuth Playground。在那里,您可以查看完整的OAuth流程,然后就可以使用API。