“Login Required” 401 Mensagem não autorizada ao chamar a API v3 do Google Agenda usando uma conta de serviço via OAuth 2.0

Primeiro, deixe-me explicar o que estou tentando fazer, pois esta é uma questão de duas partes.

Eu estou construindo um serviço JAX-RS que autentica internamente com uma conta do Google via OAuth2, para que ele possa acessar e manipular um calendário do Google. Esse serviço será chamado por um site (Joomla), que permitirá que os usuários que fizerem login no site registrem seus endereços de e-mail com eventos da agenda para que possam receber notificações por e-mail quando os eventos estiverem próximos. Esses usuários não têm conhecimento da conta do Google subjacente.

Então, minha primeira pergunta, é usar a autenticação da conta de serviço a coisa certa? Olhando para o Google docs, é o único caso de uso que atende a autenticação não humana (para autenticação de servidor para servidor).

O segundo problema é que eu escrevi algum código para fazer isso, mas eu recebo de volta uma resposta 401 / não autorizada de volta ao erro a seguir quando eu chamo o método execute no feed do Calendário. Este código foi retirado das amostras do Google.

Estou usando a v3-rev3-1.5.0-beta da API do Google Agenda. Eu ativei a API do Google Agenda na conta e criei e baixei uma chave privada, que é usada no código abaixo.

Eu estou chamando o código abaixo no Eclipse localmente, não de um servidor web.

Então, a primeira chamada que faço é recuperar um objeto de credencial (Id ofuscado por X's):

<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>

O próximo passo é, então, chamar a Calendar API, assim (nenhum outro código chamado no meio):

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

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

A chamada para list (). Execute () resulta no seguinte erro:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 {{código} não autorizado: 401, "erros": [{"domain": "global", "location": "Autorização", "locationType": " cabeçalho "," mensagem ":" Login obrigatório "," motivo ":" obrigatório "}]," mensagem ":" Login obrigatório "} em com.google.api.client.googleapis.json.GoogleJsonResponseException.from (GoogleJsonResponseException. java: 159) em com.google.api.client.googleapis.json.GoogleJsonResponseException.execute (GoogleJsonResponseException.java:187) em com.google.api.client.googleapis.services.GoogleClient.executeUnparsed (GoogleClient.java:115) em com.google.api.client.http.json.JsonHttpRequest.executeUnparsed (JsonHttpRequest.java:112) em com.google.api.services.calendar.Calendar $ CalendarList $ List.execute (Calendar.java:510) no uk .org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents (Service.java:55) em uk.org.reigatepriorybowmen.Service.main (Service.java:74)

A conta de serviço é configurada da seguinte maneira:

Então, o que estou fazendo de errado ?! Eu passei horas pesquisando procurando soluções, então esta é minha última esperança.

Muito obrigado antecipadamente por sua ajuda.

Justin

questionAnswers(6)

yourAnswerToTheQuestion