Pregunta

Esto es lo que pensé hasta ahora:

Para obtener el contenido de la hoja de cálculo "OD6" con la ID "0AJ3X4N7SOPMRDFA2VMJUAMPIUDFZDLAWRUWTSEJACMC" Debe acceder a esta URL:https://spreadsheets.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/full

(ver API)

Esto funciona bien, si pongo la URL en mi navegador (porque estoy conectado a GDOC y las cookies están configuradas).

Si me gusta acceder a la URL anterior desde mi dispositivo Gmail, creo que tengo 2 opciones.

  1. Cargarlo a través de Ajax
  2. Cárguelo directamente en el PHP que genera el gadget

Con el primer enfoque, me encuentro con el problema, que las cookies no se conocen en la llamada AJAX (supongo que esto se debe a diferentes dominios involucrados).

Información de fondo: mi gadget-php-script se ejecuta en mi host (https://sslsites.de), este gadget está cargado por Gmail y proporciona a través de algún tipo de proxy (por lo que el anfitrión de mi dispositivo dentro del iframe es http://kipb0cvv7sa9Gunc3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets). Donde está la URL en la barra de ubicación (el padre de iframes) https://mail.google.com/mail

Por lo tanto, cose una llamada Ajax de este iframe no puede enviar cookies al dominio https://spreadsheets.google.com . ¿Derecha? La respuesta está vacía.

Luego probé el segundo enfoque. Si me gusta acceder a la hoja de cálculo desde PHP, necesitaré OAuth. Que funciona bien con este código:

<?php
function make_api_call($url, $token) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $curlheader[0] = sprintf("Authorization: AuthSub token=\"%s\"/n", $token);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $curlheader);
  $output = curl_exec($ch);
  curl_close($ch);
  return $output;
}

function get_session_token($onetimetoken) {
  $output = make_api_call("https://www.google.com/accounts/AuthSubSessionToken", $onetimetoken);
  if (preg_match("/Token=(.*)/", $output, $matches)) $sessiontoken = $matches[1];
  else {
    echo "Error authenticating with Google.";
    exit;
  }
  return $sessiontoken;
}

if ($_GET['token'] and !$_COOKIE['token']) {
  $_COOKIE['token'] = get_session_token($_GET['token']);
  setcookie("token", $_COOKIE['token']);
}

if ($_COOKIE['token']) {
  $accountxml = make_api_call("https://spreadsheets.google.com/feeds/cells/tP6VbnjjHP1svP0EL-HBZrg/od6/private/full", $_COOKIE['token']);
  print_r($accountxml);
}
?>
<a href="https://www.google.com/accounts/AuthSubRequest?scope=https%3A%2F%2Fspreadsheets.google.com%2Ffeeds%2F&session=1&secure=0&next=https%3A%2F%2Fsslsites.de%2Fknox.orgapage.de%2Fdocget.php" target="_blank">Sign in</a>

Pero de nuevo, tengo el problema con los dominios aquí. Este código funciona bien en https://sslsites.de . Pero de Gmail tengo el problema, que no puedo pasar el $ _Cookie ['Token']. Si me registro https://sslsites.de Con OAuth, mi navegador no pasará la cookie a través del proxy de gadget de Gmails. Si registro el proxy (http://kipb0cvv7sa9Gunc3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets) Selfe para Oauth, la cookie está allí, pero mi script PHP también no lo sabe.

Entonces, ¿hay alguna forma en que pueda pasar el canal de cookies el proxy (que me cose como una caja negra para mí, porque no puedo encontrar ninguna documentación en él)?

¿O hay otras API para acceder a las hojas de cálculo? Las hojas de cálculo de las que estoy hablando son públicas para todos, por lo que no esperaría que uno necesite autenticarse.

Sin embargo, la hoja de cálculo es pública:https://spreadsheets.google.com/ccc?key=0aj3x4n7SopMrdfa2vmjuampiudfzdlawruwtsejacmc&hl=en&authey=cj2ppjsp

Pero no la llamada API de datos a la misma:https://spreadsheets.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/full

¿Fue útil?

Solución

Finalmente descubrí cómo usar OAuth dentro de los dispositivos.

Tienes que definirlo dentro del XML de gadgets, como este:

<OAuth>
  <Service name="google">
    <Access url="https://www.google.com/accounts/OAuthGetAccessToken" method="GET" />
    <Request url="https://www.google.com/accounts/OAuthGetRequestToken?scope=https://spreadsheets.google.com/feeds/" method="GET" />
    <Authorization url="https://www.google.com/accounts/OAuthAuthorizeToken?oauth_callback=http://oauth.gmodules.com/gadgets/oauthcallback" />
  </Service>
</OAuth>

Entonces podrás consultar la hoja de cálculo de alimentación:

function initSSData() {
  var params = {};
  params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
  params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.OAUTH;
  params[gadgets.io.RequestParameters.OAUTH_SERVICE_NAME] = "google";
  params[gadgets.io.RequestParameters.OAUTH_USE_TOKEN] = "always";
  params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;

  gadgets.io.makeRequest("https://spreadsheets.google.com/feeds/spreadsheets/private/full?title=GIdea&alt=json", function(response) {
    // Show sign in
    if (response.oauthApprovalUrl) {
      var popup = shindig.oauth.popup({
        destination: response.oauthApprovalUrl,
        windowOptions: null,
        onOpen: function() { document.getElementById('approval').style.display = "none"; document.getElementById('waiting').style.display = "block"; },
        onClose: function() { initSSData(); }
      });
      var personalize = document.getElementById('personalize');
      personalize.onclick = popup.createOpenerOnClick();
      var approvaldone = document.getElementById('approvaldone');
      approvaldone.onclick = popup.createApprovedOnClick();

      document.getElementById('approval').style.display = "block";

    // Show result
    } else if (response.data) {
      // Access the spreadsheet with response.data
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top