«Требуется вход в систему» ​​401 Несанкционированное сообщение при вызове v3 API Календаря Google с использованием учетной записи службы через OAuth 2.0

Во-первых, позвольте мне объяснить, что я пытаюсь сделать, так как это вопрос из двух частей..

Я создаю службу JAX-RS, которая выполняет внутреннюю аутентификацию с помощью учетной записи Google через OAuth2, поэтому она может получать доступ к календарю Google и управлять им. Эта служба будет вызываться веб-сайтом (Joomla), что позволит пользователям, вошедшим на сайт, зарегистрировать свой адрес электронной почты для событий календаря, чтобы они могли получать уведомления по электронной почте, когда события приближаются. Эти пользователи ничего не знают об основной учетной записи Google.

Итак, мой первый вопрос: правильно ли использовать аутентификацию учетной записи службы? Глядя на документы Google, это единственный вариант использования, который обслуживает аутентификацию не-человека (, то есть аутентификацию между серверами).

Вторая проблема заключается в том, что я написал некоторый код для этого, но я получаю ответ 401/Unauthorized со следующей ошибкой, когда я вызываю метод execute фида календаря. Этот код был взят из образцов Google.

Я использую v3-rev3-1.5.0-beta API Календаря Google. Я включил API календаря в учетной записи, а также создал и загрузил закрытый ключ, который используется в приведенном ниже коде.

Я вызываю приведенный ниже код в Eclipse локально, а не с веб-сервера.

Итак, первый вызов, который я делаю, — это получение объекта учетных данных. (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 Неавторизованный { "код" :401, "ошибки" :[ { "домен" :"глобальный", "местоположение" :"Авторизация", "locationType" :"заголовок", "сообщение" :"Требуется вход в систему", "причина" :"требуется" } ], "сообщение" :"Требуется вход в систему" } на com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159)в com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187)на com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115)на com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112)на com.google.api.services.calendar.Calendar$CalendarList$List.execute(Calendar.java:510)на uk.org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java:55)на uk.org.reigatepriorybowmen.Service.main(Service.java:74)

Учетная запись службы настроена следующим образом:

enter image description here

Итак, что я делаю не так?! Я часами гуглил в поисках решений, так что это моя последняя надежда.

Заранее большое спасибо за помощь.

Джастин

18
задан DaImTo 16 December 2016 в 07:35
поделиться