Java Google Contacts API访问服务帐户身份验证

我正在尝试访问Googles Contacts API,但由于获得授权而失败。从其他(网络)语言开始,我习惯于使用API​​Console和公共API密钥(授权)。

GoogleCredential credential = new GoogleCredential().setAccessToken("<<PublicAPIKey>>");

System.out.println(credential.refreshToken()); // false

这样,我不能够刷新令牌并不能确定如何使用公共密钥的accessToken

......相反,我尝试了一个服务帐户:

private static final String USER_ACCOUNT_EMAIL = "xy@gmail.com";

private static final String SERVICE_ACCOUNT_EMAIL = "xy@developer.gserviceaccount.com";

private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH = "xy.p12";

public App() {

Set<String> scopes = new HashSet<String>();

scopes.add("https://www.google.com/m8/feeds");

try {

GoogleCredential credential = new GoogleCredential.Builder()

.setTransport(new NetHttpTransport())

.setJsonFactory(new JacksonFactory())

.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)

.setServiceAccountScopes(scopes)

.setServiceAccountUser(USER_ACCOUNT_EMAIL)

.setServiceAccountPrivateKeyFromP12File(new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))

.build();

System.out.println(credential.refreshToken());

//System.out.println(credential.getAccessToken());

} catch (GeneralSecurityException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

这是我的例外:

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 App.<init>(App.java:50)

at App.main(App.java:29)

谢谢提示!

回答:

不调用setServiceAccountUser()我的代码就可以很好地工作。但是您只会拥有一个模拟帐户(service_account_mail),而不是您的个人联系人。

“ 401未经授权”异常的另一个可能来源是遥不可及credential.refreshToken()。调用是将访问代码写入引用所必需的。

在完成的课程下面:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;

import com.google.api.client.http.HttpTransport;

import com.google.api.client.json.jackson2.JacksonFactory;

import com.google.gdata.client.contacts.ContactsService;

import java.io.File;

import java.io.IOException;

import java.security.GeneralSecurityException;

import java.util.Collections;

public class Connector {

private static ContactsService contactService = null;

private static HttpTransport httpTransport;

private static final String APPLICATION_NAME = "Your-App/1.0";

private static final String SERVICE_ACCOUNT_EMAIL = "xy@developer.gserviceaccount.com";

private Connector() {

// explicit private no-args constructor

}

public static ContactsService getInstance() {

if (contactService == null) {

try {

contactService = connect();

} catch (GeneralSecurityException | IOException e) {

e.printStackTrace();

}

}

return contactService;

}

private static ContactsService connect() throws GeneralSecurityException, IOException {

httpTransport = GoogleNetHttpTransport.newTrustedTransport();

// @formatter:off

GoogleCredential credential = new GoogleCredential.Builder()

.setTransport(httpTransport)

.setJsonFactory(JacksonFactory.getDefaultInstance())

.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)

.setServiceAccountScopes(Collections.singleton("https://www.google.com/m8/feeds"))

.setServiceAccountPrivateKeyFromP12File(new File("key.p12"))

.build();

// @formatter:on

if (!credential.refreshToken()) {

throw new RuntimeException("Failed OAuth to refresh the token");

}

ContactsService myService = new ContactsService(APPLICATION_NAME);

myService.setOAuth2Credentials(credential);

return myService;

}

}

以上是 Java Google Contacts API访问服务帐户身份验证 的全部内容, 来源链接: utcz.com/qa/397863.html

回到顶部