secret integrar google cliente javascript oauth-2.0 google-contacts

integrar - Problemas de API de contactos de Google desde el cliente de JavaScript con autenticación OAuth2



integrar login google en mi web (1)

He estado luchando con esto durante muchas horas, los documentos parecen ser terribles. Básicamente, estoy tratando de obtener acceso de lectura a los contactos autenticados de los usuarios de OAuth2, utilizando la API de contactos portátiles o la API completa de contactos . Google recientemente comenzó a permitir OAuth2 .

Puedo obtener acceso a los contactos de un usuario a través de la API de Contactos, primero haciendo que el usuario se autentique con el alcance: "https://www.google.com/m8/feeds". Luego puedo recuperar sus primeros 25 contactos usando jQuery (el código que se muestra es 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

Eso funciona, y obtengo datos JSON. Sin embargo, casi increíblemente, el único pedido de contactos que proporciona Google (por lo que yo sé) es '' lastmodified '' (¿verdad?). Necesito algo más como ''mejores amigos'' o ''más popular''.

Lo cual, pasa a ser algo que la API de contactos portátiles de Google puede hacer , (¡ !). Por supuesto, parece que no puedo obtener una solicitud exitosa para trabajar.

Primero, hago que el usuario se autentique con la API de contactos portátiles haciendo clic en este enlace (tenga en cuenta el alcance: "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>

Eso funciona bien, y me devuelven un token de acceso.

A continuación, intento enviar una solicitud ajax a la API de contactos portátiles

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

Pero eso devuelve un error 403

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

¿Alguna idea de lo que estoy haciendo mal?

Apéndice
Encontré este informe de errores en el foro de Google OAuth2, que aconsejaba que necesitáramos establecer un encabezado de autorización cuando trabajábamos con la API de contactos portátiles. Así que lo intenté así:

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

Pero eso me da el mismo error 403:

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


El problema es que aparentemente no puede establecer un encabezado de solicitud en una solicitud JSONP. Vea la respuesta a esta pregunta para más información.

Las alternativas que puedo ver son:

  1. Use la biblioteca JS de la API de contactos de Google . Eso solo usa AuthSub, que los mismos google sugieren que es malo. Prefiero no hacer esto. Todos los demás servicios con los que interactúo usan OAuth2.
  2. Utilice los nuevos estándares Nivel 2 Ajax y XDomainRequest mencionados en la pregunta SO a la que me he vinculado. Sin embargo, vendrán con sus propios problemas. Suena como un desastre en general. No funcionará en navegadores más antiguos y tendré que hacer un montón de detección de funciones, etc. Ni siquiera sé si la API admitirá estas funciones.
  3. Hazlo todo en el servidor. Esto tampoco es exactamente ideal. Menos que la experiencia de usuario perfecta.

No debería ser este difícil Google.