Domanda

Ecco cosa ho pensato finora:

Per ottenere il contenuto del foglio di calcolo "OD6" con l'ID "0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc" devi acces questo URL: https://spreadsheets.google.com/feeds/cells/0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc/ OD6 / private / pieno

(vedi API )

Questo funziona bene, se metto l'URL nel browser (perché sto collegato alle GDocs ei biscotti sono insieme).

Se mi piace l'accesso URL sopra da dentro il mio GMail gadget, immagino ho 2 opzioni.

  1. caricarlo tramite Ajax
  2. caricarlo direttamente nel PHP che genera il gadget

Con il primo approccio mi imbatto nel problema, che i cookie non sono noti nella chiamata Ajax (Credo che questo è a causa di diversi domini coinvolti).

Informazione: Il mio Gadget-PHP-Script funziona a mio ospite ( https://sslsites.de ), questo gadget è caricato da GMail e fornito attraverso un qualche tipo di proxy (in modo che il Host del mio gadget all'interno del IFrame è http://kipb0cvv7sa9gunc3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent.com/gadgets ). In cui l'URL nella barra degli indirizzi (Il genitore IFrame) è https://mail.google.com/mail

Quindi, cuciture a una chiamata in Ajax da questa IFrame non può inviare cookie al dominio https://spreadsheets.google.com . Giusto? La risposta è vuota.

Poi ho provato il secondo approccio. Se mi piace di accedere al foglio di calcolo da PHP mi avrà bisogno di OAuth. Che funziona bene con questo codice:

<?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>

Ma ancora una volta, ho il problema con i domini qui. Questo codice funziona bene su https://sslsites.de . Ma da GMail ho il problema, che non riesco a passare il $ _COOKIE [ 'token']. Se mi registro https://sslsites.de con OAuth, il mio browser non passerà il cookie attraverso gmails procura gadget. Se mi registro il proxy ( http: //kipb0cvv7sa9gunc3o5eii57sr1eoem5-a-gm-opensocial.googleusercontent. com / gadget ) è Selfe per OAuth il cookie è lì, ma il mio script PHP non sa di esso pure.

Quindi, c'è un modo per passare il cookie attraverso il proxy (che le cuciture come una scatola nera per me, perché non riesco a trovare alcuna documentazione su di esso)?

O ci sono altre API per i fogli di calcolo di accesso? I fogli di calcolo di cui sto parlando sono pubblici per tutti, quindi non mi aspetto uno alla necessità di autenticazione.

Tuttavia, il foglio di calcolo è pubblico: https://spreadsheets.google.com/ccc?key=0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc&hl=en&authkey= CJ2ppJsP

Ma non l'API chiamata dati al medesimo: https://spreadsheets.google.com/feeds/cells/0Aj3x4n7SOPMRdFA2VmJuampIUDFzdlAwRUwtSEJacmc/ OD6 / private / pieno

È stato utile?

Soluzione

I finalmente capito come utilizzare OAuth all'interno dei gadget.

È necessario definire all'interno del gadget XML, in questo modo:

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

Poi si sarà in grado di interrogare i feed dei fogli di calcolo:

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
    }
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top