Mensaje "No requerido para iniciar sesión" 401 no autorizado al llamar a la API v3 de Google Calendar usando una cuenta de servicio a través de OAuth 2.0

Primero, permítame explicarle lo que estoy tratando de hacer, ya que esta es una pregunta de dos partes.

Estoy creando un servicio JAX-RS que se autentica internamente con una cuenta de Google a través de OAuth2, para que pueda acceder y manipular un calendario de Google. Este servicio lo llamará un sitio web (Joomla), que permitirá a los usuarios que inician sesión en el sitio registrar su dirección de correo electrónico con eventos del calendario para que puedan recibir notificaciones por correo electrónico cuando estén cerca. Estos usuarios no tienen conocimiento de la cuenta de Google subyacente.

Entonces, mi primera pregunta, ¿es la autenticación de la cuenta de servicio lo correcto? Mirando los documentos de Google, es el único caso de uso que satisface la autenticación no humana (por lo tanto, la autenticación de servidor a servidor).

El segundo problema es que escribí algo de código para hacer esto, pero recibo una respuesta 401 / No autorizada que devuelve el siguiente error cuando llamo al método de ejecución el feed del calendario. Este código fue sacado de las muestras de Google.

Estoy usando v3-rev3-1.5.0-beta de la API de Google Calendar. He activado la API del calendario en la cuenta, y he creado y descargado una clave privada, que se utiliza en el siguiente código.

Estoy llamando al código de abajo en Eclipse localmente, no desde un servidor web.

Así que la primera llamada que hago es recuperar un objeto de credencial (la identificación está oculta con las 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>

El siguiente paso es llamar a la API del calendario, así (no hay otro código llamado entre):

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

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

La llamada a list (). Execute () produce el siguiente error:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 {"code" no autorizado: 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) en com.google.api.client.googleapis.json.GoogleJsonResponseException.execute (GoogleJsonResponseException.java:187) en com.google.api.client.googleapis.services.GoogleClient.executeEpc. en com.google.api.client.http.json.JsonHttpRequest.executeUnparsed (JsonHttpRequest.java:112) en com.google.api.services.calendar.Calendar $ CalendarList $ List.execute (Calendar.java:510) en la página web .org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents (Service.java:55) en uk.org.reigatepriorybowmen.Service.main (Service.java:74)

La cuenta de servicio se configura de la siguiente manera:

Entonces, ¿qué estoy haciendo mal? He pasado horas buscando en Google buscando soluciones, así que esta es mi última esperanza.

Muchas gracias de antemano por su ayuda.

Justin

Respuestas a la pregunta(6)

Su respuesta a la pregunta