Во-первых, позвольте мне объяснить, что я пытаюсь сделать, поскольку это вопрос из двух частей.
Я создаю службу JAX-RS, которая внутренне аутентифицируется с помощью учетной записи Google через OAuth2, поэтому она может получать доступ и управлять календарями Google. Эта услуга будет вызываться веб-сайтом (Joomla), который позволит пользователям, которые заходят на сайт, регистрировать свой адрес электронной почты с событиями в календаре, чтобы они могли получать уведомления по электронной почте, когда события близки. Эти пользователи не знают основную учетную запись Google.
Итак, мой первый вопрос, правильно ли используется проверка подлинности учетной записи? Глядя на документы Google, это единственный прецедент, который подходит для проверки подлинности, отличной от человека (например, для проверки подлинности на сервере).
Вторая проблема заключается в том, что я написал какой-то код для этого, но я возвращаю ответ 401/Unauthorized обратно обратно следующую ошибку, когда я вызываю метод execute в канале календаря. Этот код был снят с образцов Google.
Я использую v3-rev3-1.5.0-бета 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("[email protected]")
.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": "header", "message": "Login Required", "причина": "требуется", }], "message": "Login Required" } на com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159) на 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) на uk.org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java:55) на uk.org.reigatepriorybowmen.Service.main(Service.java:74)
Учетная запись службы настроена следующим образом:
Итак, что я делаю неправильно?! Я потратил много времени на поиск решений, поэтому это моя последняя надежда.
Большое спасибо за вашу помощь.
Джастин