gpt4 book ai didi

google-api - 通过 OAuth 2.0 和私钥又名服务帐户访问 Google Contacts Api

转载 作者:行者123 更新时间:2023-12-04 21:45:54 26 4
gpt4 key购买 nike

我目前正在通过 OAuth 2.0 和所谓的服务帐户实现对 Google 通讯录的访问。服务帐户是为像“My.Name@gmail.com”这样的普通用户生成的。

生成 OAuth 2.0 凭证的代码是:

public static GoogleCredential getCredentials() throws GeneralSecurityException, IOException {
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SingleUserCredentials.SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes("https://www.google.com/m8/feeds")
.setServiceAccountPrivateKeyFromP12File(new File(SingleUserCredentials.SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.build();
credential.refreshToken();
return credential;
}

然后我尝试通过以下方式检索联系人:
    ContactsService myService = new ContactsService(
"myApp");

myService.setOAuth2Credentials(getCredentials());

URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full");
Query myQuery = new Query(feedUrl);
ContactFeed resultFeed = myService.query(myQuery, ContactFeed.class);
// Print the results

for (ContactEntry entry : resultFeed.getEntries()) {
System.out.println(entry.getName().getFullName().getValue());
System.out.println("Updated on: " + entry.getUpdated().toStringRfc822());
}

问题是我没有从我的帐户中获得任何联系人。提要总是空的。没有错误。没有。

通过相同的方法访问 Google Apps 托管域时,它运行良好。

我想知道在使用 p12 key 文件和服务帐户时,Contacts Api 是否支持普通(又名@gmail.com)帐户的 OAuth 2.0。

最佳答案

我自己也遇到了同样的问题。

我尝试了设置 key 时收到的电子邮件地址和域管理员的电子邮件地址。

当我使用来自 key 设置的电子邮件时,我根本没有收到任何东西——没有警告、没有异常(exception),也没有数据。

当我使用域管理员的电子邮件地址时,我收到一个异常:

com.google.api.client.auth.oauth2.TokenResponseException: 400 OK
[java] {
[java] "error" : "invalid_grant"
[java] }
[java] Feb 5, 2013 5:16:48 PM com.google.appengine.repackaged.org.apache.http.impl.client.DefaultRequestDirector handleResponse
[java] WARNING: Authentication error: Unable to respond to any of these challenges: {}
[java] Feb 5, 2013 5:16:48 PM com.google.apphosting.utils.jetty.JettyLogger warn
[java] WARNING: /
[java] java.lang.NullPointerException: No authentication header information

...

所以,我认为域管理员的电子邮件地址不是我需要的。

接下来,我在 Google 上搜索了一段时间,然后才找到此页面:

http://javadoc.google-api-java-client.googlecode.com/hg/1.13.2-beta/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.html

我在那里看到了getServiceAccountUser()。该字段的描述是:

返回应用程序试图在服务帐户流中模拟的用户的电子邮件地址,如果没有或不使用服务帐户流,则返回 null。

果然,有一个对应的 setServiceAccountUser (String) 接受您使用服务帐户来模拟的用户的用户名(电子邮件地址)。

我将该字段设置为适当的值,然后我就可以继续了。

回想起来,这一切都是有道理的——如果我不提供我正在尝试使用的帐户,我将无法下拉该帐户的联系人。

关于google-api - 通过 OAuth 2.0 和私钥又名服务帐户访问 Google Contacts Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com