„Wymagane logowanie” 401 Nieautoryzowana wiadomość podczas wywoływania interfejsu API Kalendarza Google v3 przy użyciu konta usługi za pośrednictwem OAuth 2.0

Po pierwsze, pozwól mi wyjaśnić, co próbuję zrobić, ponieważ jest to pytanie dwuczęściowe.

Buduję usługę JAX-RS, która wewnętrznie uwierzytelnia się z konta Google za pośrednictwem OAuth2, dzięki czemu może uzyskać dostęp do kalendarza Google i manipulować nim. Ta usługa będzie wywoływana przez stronę internetową (Joomla), która pozwoli użytkownikom, którzy zalogują się na stronie, zarejestrować swój adres e-mail za pomocą wydarzeń w kalendarzu, aby mogli otrzymywać powiadomienia e-mail o zbliżających się wydarzeniach. Użytkownicy ci nie mają wiedzy o bazowym koncie Google.

Więc moje pierwsze pytanie, czy używanie uwierzytelniania konta usługi jest właściwe? Patrząc na dokumenty Google, jest to jedyny przypadek użycia, który służy do uwierzytelniania osób trzecich (a więc uwierzytelniania serwera na serwer).

Drugi problem polega na tym, że napisałem jakiś kod, aby to zrobić, ale otrzymuję odpowiedź 401 / Nieautoryzowana, zwracającą następujący błąd, gdy wywołam metodę wykonywania kanału kalendarza. Ten kod został usunięty z próbek Google.

Korzystam z v3-rev3-1.5.0-beta interfejsu API Kalendarza Google. Włączyłem interfejs API kalendarza na koncie i utworzyłem i pobrałem klucz prywatny, który jest używany w poniższym kodzie.

Dzwonię pod poniższy kod w Eclipse lokalnie, a nie z serwera WWW.

Pierwszym połączeniem, które wykonuję, jest odzyskanie obiektu poświadczającego (zaciemnionego identyfikatorem X przez X):

<code>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();
</code>

Następnym krokiem jest wywołanie API Calendar, w ten sposób (między innymi nie jest wywoływany żaden inny kod):

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

 CalendarList feed = calendar.calendarList().list().execute();
</code>

Wywołanie list (). Execute () powoduje następujący błąd:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized {"code": 401, "errors": [{"domain": "global", "location": "Authorization", "locationType": " nagłówek „,” wiadomość ”:„ Wymagany login ”,„ powód ”:„ wymagany ”}],„ komunikat ”:„ Wymagane logowanie ”} na com.google.api.client.googleapis.json.GoogleJsonResponseException.from (GoogleJsonResponseException. java: 159) w com.google.api.client.googleapis.json.GoogleJsonResponseException.execute (GoogleJsonResponseException.java:187) pod adresem com.google.api.client.googleapis.services.GoogleClient.executeUnparsed (GoogleClient.java:115) w com.google.api.client.http.json.JsonHttpRequest.executeUnparsed (JsonHttpRequest.java:112) na com.google.api.services.calendar.Calendar $ CalendarList $ List.execute (Calendar.java:510) w uk .org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents (Service.java:55) w uk.org.reigatepriorybowmen.Service.main (Service.java:74)

Konto usługi jest skonfigurowane w następujący sposób:

Więc co robię źle ?! Spędziłem wiele godzin na szukaniu rozwiązań, więc to moja ostatnia nadzieja.

Z góry dziękuję za pomoc.

Justin

questionAnswers(6)

yourAnswerToTheQuestion