“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:
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?
Vous devez vous connecter pour publier un commentaire.
Comme pour le 401, il semble que certaines bizarrerie avec les API Google. Je trouve la première fois que je lance mon application dans un certain temps, et ensuite à des intervalles apparemment aléatoires heures écartées, je reçois toujours un 401. Sur la deuxième ou de la troisième étape, il fait dans les journaux.
Le comportement est même représenté dans Google Tâche de l'exemple de code API ici.
Avis ce code:
}
Dans Google le code de l'échantillon, ils ont fait des provisions pour une première fois, 401. Il peut-être certains question de sécurité qui doit être traité dans le code.
Un tel comportement peut se produire si vous n'avez pas à ajouter de l'api de l'utilisateur dans le panneau admin (dans votre cas, le panneau Documents, je suppose), par exemple, dans google analytics, vous devez ajouter un nouvel utilisateur, adresse e-mail est le même que vous avez obtenu à partir de l'api (fourni par l'API de Google Compte de Service, après la création de la clé privée).
Dans google analytics, il ressemble à ceci:
Je pense que vous aurez besoin de spécifier le nom d'utilisateur que vous essayez d'imiter.
La façon dont vous utilisez ServiceAccount droit maintenant, c'est seulement valide pour accéder à des données liées à votre demande ou à votre compte de service lui-même. Puisque vous souhaitez accéder à Google Agenda, vous devez être un administrateur de domaine Google Apps avec les privilèges nécessaires pour accéder à votre domaine de données de l'utilisateur - permettez-moi de savoir si je ne suis pas correct. Google Agenda données appartenant à des utilisateurs de sorte que vous devez spécifier quel utilisateur que vous essayez d'imiter.
Pour ce faire à l'aide de Java, il semble que vous avez besoin de faire usage GoogleCredential.Builder#setServiceAccountUser(String)
S'il vous plaît essayer:
Aussi, une fois que vous avez créé un Compte de Service de clé dans votre projet d'API (à partir de l'Api de la Console), vous devrez ajouter ce projet à la liste des tiers autorisé application dans le cPanel. Plus d'informations à ce sujet peuvent être trouvées ici. Le "Client Id", vous devez utiliser est celui lié au Compte de Service de clé et ressemble
<APP_ID>-<OTHER_KEY>.apps.googleusercontent.com
Je suis un Android Développeur d'applications Mobiles. J'ai fais une demande à l'aide de Google Agenda (API OAuth 2.0). J'ai aussi été confronté à ce même message d'erreur. Mais maintenant, j'ai résolu l'erreur. Je suis en train d'écrire le scénario et la solution pour elle.
L'url d'obtenir le Calendrier des Événements de l'agenda particulier (Application Mobile API):
Dans cette url, il faut ajouter la calendarId. Le format de l'url est;
Je n'étais pas l'encodage de la calendarId avant d'ajouter à l'url.
J'ai codé la calendarId et a ensuite fait la requête Http. Tout s'est bien passé ensuite.
Maintenant, les événements de calendrier sont retournés dans le JSON.
OK, donc j'ai été jouer avec cela et ai passé l'erreur 401, mais je suis maintenant de frapper un 403. Cependant, je vais détailler le code que j'ai écrit au moins des réponses 401 problème.
Je n'ai pas modifier les paramètres de compte de service ou de re-générer un quelconque des touches, etc, qui est tout de même.
Ce qui a le changement est une partie du code, et j'ai mis à v3r20lv1.12.0-beta de l'API Calendar.
Le code ci-dessous, comme détaillé ci-dessus dans l'OP, reste le même, c'est à dire:
Le code pour obtenir un handle pour le Calendrier a changé, mais cela a été contraint par une API changement:
À ce point, je peux parcourir mon calendrier et les événements, en exécutant le code suivant (il imprime un événement résumé):
Mais, si j'essaie et mise à jour d'un événement, j'obtiens une erreur 403 Forbidden. Je vais élever un thread séparé pour cela, et permettra de relier les deux fils ensemble.
Merci à tous pour votre aide!
EDIT: ici est le nouveau thread.
Avez-vous demandé l'autorisation pour le bon étendues? Vous devez toujours inclure
https://www.googleapis.com/auth/userinfo.profile