“Connexion Requise” 401 Unauthorized message lors de l'appel de la v3 de Google Calendar API à l'aide d'un Compte de Service via OAuth 2.0

Tout d'abord, laissez-moi vous expliquer ce que je suis en train de faire, puisque c'est une des deux partie de la question.

Je suis la construction d'un JAX-RS de service en interne authentifie avec un compte Google via OAuth2, de sorte qu'il peut accéder et de manipuler un calendrier Google. Ce service sera appelé par un site web (Joomla), qui permettra aux utilisateurs d'ouvrir une session dans le site afin d'enregistrer leur adresse e-mail avec les événements de calendrier, de sorte qu'ils peuvent obtenir des notifications par courriel lorsque les événements sont à proximité. Ces utilisateurs n'ont pas la connaissance du sous-jacent compte Google.

Donc, ma première question, est-en utilisant le Service d'authentification de Compte la bonne chose? À la recherche à la Google docs, c'est le seul cas d'utilisation qui s'adresse aux non-humains d'authentification (sorte de serveur à serveur d'authentification).

Le deuxième problème est que j'ai écrit un code pour le faire, mais je serai de retour 401/non autorisée réponse en retour l'erreur suivante quand j'ai appeler la méthode execute le Calendrier d'alimentation. Ce code a été levé à partir de Google échantillons.

Je suis en utilisant v3-rev3-1.5.0-bêta du Calendrier Google API. J'ai tourné sur le Calendrier de l'API dans le compte, et a créé et téléchargé une clé privée, qui est utilisé dans le code ci-dessous.

Je vais appeler le code ci-dessous dans Eclipse localement, et non pas à partir d'un serveur web.

De sorte que le premier appel que j'ai faire est de récupérer des informations d'identification de l'objet (Id est brouillée avec 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();

La prochaine étape consiste alors à appeler le Calendrier de l'API, comme (aucun autre code entre les deux):

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

 CalendarList feed = calendar.calendarList().list().execute();

L'appel à la liste().execute() génère l'erreur suivante:

com.google.l'api.client.googleapis.json.GoogleJsonResponseException: 401 Non Autorisé
{
"code" : 401,
les "erreurs" : [ {
"domaine" : "global",
"emplacement" : "Autorisation",
"locationType" : "en-tête",
"message" : "Connexion Requise",
la "raison" : "requis"
} ],
"message" : "Connexion Requise"
}
au com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159)
au com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187)
au com.google.l'api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115)
au com.google.l'api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112)
au com.google.l'api.services.calendrier.Calendrier$CalendarList$Liste.execute(Calendrier.java:510)
au royaume-uni.org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service de.java:55)
au royaume-uni.org.reigatepriorybowmen.Service.principale(de Service.java:74)

Le compte de service est configuré comme suit:

“Connexion Requise” 401 Unauthorized message lors de l'appel de la v3 de Google Calendar API à l'aide d'un Compte de Service via OAuth 2.0

Donc, ce que je fais mal?! J'ai passé des heures sur Google à la recherche de solutions donc c'est mon dernier espoir.

Merci beaucoup d'avance pour votre aide.

Justin

  • avez-vous jamais trouvé la solution?