Google calendar api 谷歌日历API返回“;无效凭证“;(401)
我在使用Java客户端库(谷歌API客户端版本1.13.2-beta,谷歌API服务日历版本3-rev26-1.13.2-beta)验证谷歌日历API v3时遇到问题 我们有一个marketplace应用程序,安装该应用程序应为其提供读取(和写入)Google日历事件所需的凭据 我们使用的是两条腿的OAuth 1.0和Hmac,这意味着不需要令牌。 这正是我试图做的,但使用日历而不是任务: 这是我从谷歌得到的错误:Google calendar api 谷歌日历API返回“;无效凭证“;(401),google-calendar-api,google-api-java-client,google-oauth,Google Calendar Api,Google Api Java Client,Google Oauth,我在使用Java客户端库(谷歌API客户端版本1.13.2-beta,谷歌API服务日历版本3-rev26-1.13.2-beta)验证谷歌日历API v3时遇到问题 我们有一个marketplace应用程序,安装该应用程序应为其提供读取(和写入)Google日历事件所需的凭据 我们使用的是两条腿的OAuth 1.0和Hmac,这意味着不需要令牌。 这正是我试图做的,但使用日历而不是任务: 这是我从谷歌得到的错误: com.google.api.client.googleapis.json.G
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());
}
}
}
import java.io.IOException;
导入java.util.List;
导入org.junit.Test;
导入com.google.api.client.auth.oauth.oauthMacSigner;
导入com.google.api.client.auth.oauth.oauth参数;
导入com.google.api.client.http.javanet.NetHttpTransport;
导入com.google.api.client.json.jackson.JacksonFactory;
导入com.google.api.services.calendar.calendar;
导入com.google.api.services.calendar.CalendarRequest;
导入com.google.api.services.calendar.CalendarRequestInitializer;
导入com.google.api.services.calendar.model.CalendarListEntry;
导入junit.framework.Assert;
公共类谷歌测试{
@试验
公开无效测试(){
最终字符串API_KEY=“…”;
最终字符串CONSUMER_KEY=“…”;
最终字符串CONSUMER_KEY_SECRET=“…”;
最终字符串GOOGLE_USER=”me@mydomain.com";
//2-LO授权部分
OAuthHmacSigner signer=新的OAuthHmacSigner();
signer.clientSharedSecret=消费者密钥密钥;
最终OAuthParameters OAuthParameters=新的OAuthParameters();
oauthParameters.version=“1”;
oauthParameters.consumerKey=消费者密钥;
oauthParameters.signer=签名者;
日历服务=new Calendar.Builder(新NetHttpTransport()、新JacksonFactory()、oauthParameters)
.setApplicationName(“myapp”)
.setCalendarRequestInitializer(新的CalendarRequestInitializer(){
@凌驾
受保护的void initializeCalendarRequest(CalendarRequest请求)引发IOException{
请求设置密钥(API_密钥);
}
}).build();
试一试{
com.google.api.services.calendar.calendar.CalendarList.List=service.CalendarList().List();
list.getUnknownKeys().put(“xoauth\u请求者\u id”,GOOGLE\u用户);
//这就是我得到例外的地方!
List calendarList=List.execute().getItems();
}捕获(IOE异常){
Assert.fail(“测试失败:+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);
}
};
CalendarRequestInitializer初始值设定项=新的CalendarRequestInitializer(){
@凌驾
受保护的void initializeCalendarRequest(CalendarRequest CalendarRequest)引发IOException{
ArrayMap customKeys=新的ArrayMap();
添加(“xoauth请求者id”,用户的电子邮件);
calendarRequest.setUnknownKeys(自定义键);
}
};
这对我有用。。。希望有帮助
更新使用在Marketplace->My Vendor Profile->My App中单击“注册其他API”链接时获得的API密钥。不确定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);
}
};
CalendarRequestInitializer初始值设定项=新的CalendarRequestInitializer(){
@凌驾
受保护的void initializeCalendarRequest(CalendarRequest CalendarRequest)引发IOException{
ArrayMap customKeys=新的ArrayMap();
添加(“xoauth请求者id”,用户的电子邮件);
calendarRequest.setUnknownKeys(自定义键);
}
};
这对我有用。。。希望有帮助
更新使用在Marketplace->My Vendor Profile->My App中单击“注册其他API”链接时获得的API密钥。我稍后在代码中设置xoauth\u请求者id,如下所示:
list.getUnknownKeys().put(“xoauth\u请求者id”,GOOGLE\u用户)代码>如果跳过API键,则会出现以下错误:403禁止{“代码”:403,“错误”:[{“域”:“usageLimits”,“消息”:“未配置访问”,“原因”:“accessNotConfigured”}],“消息”:“未配置访问”
我看到了,但是,嘿,这对我有用。你的其他代码都是一样的,为什么不试试呢?我没有在任何地方使用API密钥,但是你是否在此处设置了与你的市场列表相关的google API控制台:?现在我已经尝试过了,但不幸的是我得到了相同的错误:(现在我明白了!我需要使用在Marketplace->My Vendor Profile->My App中单击“注册其他API”链接时获得的API密钥。我正在使用另一个API