7 votes

Problèmes liés à l'API Google Contacts depuis un client JavaScript avec authentification OAuth2

Je me débats avec ça depuis plusieurs heures maintenant, les docs semblent être terribles. En gros, j'essaie d'obtenir un accès en lecture aux contacts d'un utilisateur authentifié par OAuth2, en utilisant soit l'option API Portable Contacts ou le plein Contacts API . Google a récemment a commencé permettant OAuth2 .

Je peux accéder aux contacts d'un utilisateur via l'API Contacts en demandant d'abord à l'utilisateur de s'authentifier avec la portée : "https://www.google.com/m8/feeds". Ensuite, je peux récupérer ses 25 premiers contacts en utilisant jQuery (le code affiché est le suivant CoffeeScript )

$.ajax
  url: "https://www.google.com/m8/feeds/contacts/default/full"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  success: (data, status) ->
    console.log "The returned data", data

Cela fonctionne, et j'obtiens des données JSON. Cependant, de façon presque incroyable, le seul ordre des contacts que Google fournit (pour autant que je sache) est ' dernière modification (sérieusement wtf ?). J'ai besoin de quelque chose comme "les meilleurs amis" ou "les plus populaires".

Ce qui, par hasard, est quelque chose que l'API Google Portable Contacts peut faire (Yay !). Bien sûr, je n'arrive pas à faire fonctionner une demande réussie.

Tout d'abord, je demande à l'utilisateur de s'authentifier avec l'API de contacts portables en cliquant sur ce lien (notez la portée : "https://www-opensocial.googleusercontent.com/api/people")

<a href="https://accounts.google.com/o/oauth2/authclient_id=457681297736.apps.googleusercontent.com&response_type=token&redirect_uri=http://localhost:3000/team&scope=https://www-opensocial.googleusercontent.com/api/people">Import Google Contacts</a>

Cela fonctionne bien, et je reçois un jeton d'accès en retour.

Ensuite, j'essaie d'envoyer une requête ajax à l'API des contacts portables.

$.ajax
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  success: (data, status) ->
    console.log "The returned data", data

Mais cela renvoie une erreur 403

403 (The currently logged in user and/or the gadget requesting data, does not have access to people data.

Une idée de ce que je fais mal ?

Annexe
J'ai trouvé ce rapport de bogue dans le forum Google OAuth2 qui indiquait que nous devions définir un en-tête d'autorisation lorsque nous travaillons avec l'API Portable Contacts. J'ai donc essayé comme ceci :

$.ajax
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  beforeSend: (xhr) ->
    xhr.setRequestHeader "Authorization", "OAuth #{token}"
  data: { access_token: token }
  success: (data, status) ->
    console.log "The returned data", data

Mais cela me donne la même erreur 403 :

403 (The currently logged in user and/or the gadget requesting data, does not have access to people data

6voto

David Tuite Points 5342

Le problème est que vous ne pouvez apparemment pas définir un en-tête de requête sur une requête JSONP. Voir la réponse sur cette question pour plus d'informations.

Pour autant que je sache, les alternatives sont les suivantes :

  1. Utilisez le Bibliothèque JS de l'API Google Contacts . Cela n'utilise que AuthSub qui, selon Google, est mauvais. Je préfère ne pas faire ça. Tous les autres services avec lesquels j'interagis utilisent OAuth2.
  2. Utilisez les nouvelles normes Ajax et XDomainRequest de niveau 2 mentionnées dans la question SO dont j'ai donné le lien. Cependant, elles poseront leurs propres problèmes. Dans l'ensemble, c'est un véritable gâchis. Il ne fonctionnera pas dans les anciens navigateurs et je devrai faire un tas de détection de fonctionnalités, etc. Je ne sais même pas si l'API prendra en charge ces fonctionnalités.
  3. Faites tout sur le serveur. Ce n'est pas vraiment l'idéal non plus. Une expérience utilisateur moins que parfaite.

Ça ne devrait pas être si difficile, Google.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X