我在使用Java客户端库(google-api客户端版本1.13.2-beta,google-api服务-日历版本v3-rev 26-1.13.2-beta)对Google日历API v3进行身份验证时遇到问题。
我们有一个marketplace应用程序,安装该应用程序应为其提供读取(和写入)Google日历事件所需的凭据。
我们使用2腿OAuth 1.0,带有Hmac,这意味着不需要代币。这正是我正在尝试做的,但使用日历而不是任务:https://developers.google.com/google-apps/help/articles/2lo-in-tasks-for-marketplace
这是我从Google得到的错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
"code" : 401,
"errors" : [ {
"domain" : "global",
"location" : "Authorization",
"locationType" : "header",
"message" : "Invalid Credentials",
"reason" : "authError"
} ],
"message" : "Invalid Credentials"
}
我们还有一些客户不使用Marketplace应用程序,但已经手动为我们的域授予了适当的权限,并且一切都很好。只有使用Marketplace应用程序的客户才有这个问题(使用不同的consumerKey和ConsumerCret),这让我相信代码没有问题,但我们忽略了Google设置中的某些地方。。
Marketplace应用程序的权限看起来不错。
我遵循了我能找到的每一条适合我们的设置的指南(虽然外面的指南并不多),就我所知,我做的是正确的。
API密钥似乎设置正确(授予对日历API的访问权限)。正如我所提到的,这适用于我们的客户,而不是来自Marketplace应用程序,并且他们使用相同的API密钥。
无论如何,这里有一个失败的JUnit测试来重现错误:
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import com.google.api.client.auth.oauth.OAuthHmacSigner;
import com.google.api.client.auth.oauth.OAuthParameters;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.calendar.Calendar;
import com.google.api.services.calendar.CalendarRequest;
import com.google.api.services.calendar.CalendarRequestInitializer;
import com.google.api.services.calendar.model.CalendarListEntry;
import junit.framework.Assert;
public class GoogleOAuthTest {
@Test
public void test() {
final String API_KEY = "...";
final String CONSUMER_KEY = "...";
final String CONSUMER_KEY_SECRET = "...";
final String GOOGLE_USER = "me@mydomain.com";
// The 2-LO authorization section
OAuthHmacSigner signer = new OAuthHmacSigner();
signer.clientSharedSecret = CONSUMER_KEY_SECRET;
final OAuthParameters oauthParameters = new OAuthParameters();
oauthParameters.version = "1";
oauthParameters.consumerKey = CONSUMER_KEY;
oauthParameters.signer = signer;
Calendar service = new Calendar.Builder(new NetHttpTransport(), new JacksonFactory(), oauthParameters)
.setApplicationName("myapp")
.setCalendarRequestInitializer(new CalendarRequestInitializer() {
@Override
protected void initializeCalendarRequest(CalendarRequest<?> request) throws IOException {
request.setKey(API_KEY);
}
}).build();
try {
com.google.api.services.calendar.Calendar.CalendarList.List list = service.calendarList().list();
list.getUnknownKeys().put("xoauth_requestor_id", GOOGLE_USER);
// This is where I get the exception!
List<CalendarListEntry> calendarList = list.execute().getItems();
} catch (IOException e) {
Assert.fail("Test failed: " + e.getMessage());
}
}
}
我可能做错了什么?我的代码是否有明显的问题,或者我们可能在Google设置中遗漏了什么?
不确定API密钥是什么,但我有非常相似的代码,除了请求初始值设定项:
CalendarRequestInitializer initializer = new CalendarRequestInitializer() {
@Override
protected void initializeCalendarRequest(CalendarRequest<?> calendarRequest) throws IOException {
ArrayMap<String, Object> customKeys = new ArrayMap<String, Object>();
customKeys.add("xoauth_requestor_id", EMAIL_OF_THE_USER);
calendarRequest.setUnknownKeys(customKeys);
}
};
这对我有用。。。希望有帮助;
更新使用您在Marketplace中单击“注册其他API”链接时获得的API密钥-
一些(但不是全部)Google帐户在尝试访问Google日历API时始终响应401,尽管Tokeninfo告诉我我正在使用的访问令牌具有适当的范围(请参阅下面的curl输出)。我可以使用刷新令牌成功获取新的访问令牌,但日历api继续到401。 有人知道为什么会发生这种情况吗?
我想使用脚本化方法(可能是通过)curl,从驱动器api访问一些简单的信息,例如创建日期。从本质上讲,我想在他们的Web界面中编写我可以做的事情:https://developers.google.com/drive/api/v3/reference/files/list。 我一直在使用curl命令,他们在上面的链接的查询中公开该命令: 我为此创建了一个API密钥(目前不受限制)。并使用此应用程序
最近,在Google日历中添加了新事件并尝试从Google日历API中获取后,我从未获得我帐户主日历的新事件列表。 此外,我还尝试从开发人员控制台获取:https://developers.google.com/google-apps/calendar/v3/reference/events/list#try-it 它给出了相同的空项目列表作为响应,即使未来的事件存在。 但是我能够获取其他日历列表
运行该命令后,我没有看到任何输出,也没有看到名为的系统环境变量(它应该出现在那里吗?)。 当我尝试运行一些基本的示例代码时: 即使在手动将该值添加到系统环境变量之后,我也会得到相同的错误。
我试图创建一个谷歌日历服务帐户。 以下是我的证件: 以下是我的服务帐户定义(已启用服务帐户的站点范围委托):