gpt4 book ai didi

oauth-2.0 - "Login Required"401 通过 OAuth 2.0 使用服务帐户调用 v3 Google Calendar API 时出现未经授权的消息

转载 作者:行者123 更新时间:2023-12-03 06:27:28 25 4
gpt4 key购买 nike

首先,让我解释一下我想要做什么,因为这是一个由两部分组成的问题。

我正在构建一个 JAX-RS 服务,该服务通过 OAuth2 对 Google 帐户进行内部身份验证,因此它可以访问和操作 Google 日历。该服务将由网站 (Joomla) 调用,该网站将允许登录该网站的用户在日历事件中注册其电子邮件地址,以便在事件临近时收到电子邮件通知。这些用户不了解底层的 Google 帐户。

所以我的第一个问题是,使用服务帐户身份验证正确吗?查看 Google 文档,它是唯一满足非人工身份验证(即服务器到服务器身份验证)的用例。

第二个问题是我已经编写了一些代码来执行此操作,但是当我调用日历提要的执行方法时,我收到了 401/未经授权的响应,并返回以下错误。此代码是从 Google 示例中提取的。

我正在使用 Google Calendar API v3-rev3-1.5.0-beta。我已在帐户中打开日历 API,并创建并下载了私钥,该私钥将在下面的代码中使用。

我在本地 Eclipse 中调用下面的代码,而不是从 Web 服务器调用。

因此,我进行的第一个调用是取回一个凭证对象(Id 用 X 进行混淆):

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
.
.
.
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("284XXXXXXXX@developer.gserviceaccount.com")
.setServiceAccountScopes(CalendarScopes.CALENDAR)
.setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12"))
.build();

下一步是调用日历 API,如下所示(中间没有调用其他代码):

 Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY)
.setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential)
.build();

CalendarList feed = calendar.calendarList().list().execute();

调用 list().execute() 会导致以下错误:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized { "code" : 401, "errors" : [ { "domain" : "global", "location" : "Authorization", "locationType" : "header", "message" : "Login Required", "reason" : "required" } ], "message" : "Login Required" } at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159) at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187) at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115) at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112) at com.google.api.services.calendar.Calendar$CalendarList$List.execute(Calendar.java:510) at uk.org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java:55) at uk.org.reigatepriorybowmen.Service.main(Service.java:74)

服务帐户设置如下:

enter image description here

所以,我做错了什么?!我花了几个小时在谷歌上搜索解决方案,所以这是我最后的希望。

非常感谢您的帮助。

贾斯汀

最佳答案

至于 401,谷歌的 API 似乎有些奇怪。我发现第一次运行我的应用程序有一段时间了,然后以看似随机的时间间隔,我总是收到 401。在第二轮或第三轮时,它实际上登录了。

该行为甚至在 Google 的任务 API 示例代码 here 中得到了解释。 .

注意这段代码:

void onRequestCompleted() {
received401 = false;
}

void handleGoogleException(IOException e) {
if (e instanceof GoogleJsonResponseException) {
GoogleJsonResponseException exception = (GoogleJsonResponseException) e;
if (exception.getStatusCode() == 401 && !received401) {
received401 = true;
accountManager.invalidateAuthToken(credential.getAccessToken());
credential.setAccessToken(null);
SharedPreferences.Editor editor2 = settings.edit();
editor2.remove(PREF_AUTH_TOKEN);
editor2.commit();
gotAccount();
return;
}
}
Log.e(TAG, e.getMessage(), e);

}

在 Google 自己的代码示例中,他们首次设置了 401。这可能是一些特殊的安全问题,需要在代码中处理。

关于oauth-2.0 - "Login Required"401 通过 OAuth 2.0 使用服务帐户调用 v3 Google Calendar API 时出现未经授权的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10112939/

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