当前位置: 首页 > 知识库问答 >
问题:

返回“无效凭据”的Google日历API(401)

柳俊逸
2023-03-14

我在使用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设置中遗漏了什么?

共有1个答案

汤博
2023-03-14

不确定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 它给出了相同的空项目列表作为响应,即使未来的事件存在。 但是我能够获取其他日历列表

  • 运行该命令后,我没有看到任何输出,也没有看到名为的系统环境变量(它应该出现在那里吗?)。 当我尝试运行一些基本的示例代码时: 即使在手动将该值添加到系统环境变量之后,我也会得到相同的错误。

  • 我试图创建一个谷歌日历服务帐户。 以下是我的证件: 以下是我的服务帐户定义(已启用服务帐户的站点范围委托):