Google calendar api 谷歌日历API返回“;无效凭证“;(401)

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

我在使用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.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