Frage

Hier ist, was ich bisher dachte:

Um Inhalte der Tabelle "OD6" mit der ID "0aj3x4n7SopMrdfa2vmjuampiudfzdlawruwtsejacmc" zu erhalten ", müssen Sie diese URL abrufen:https://spreadsheets.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/private/full

(sehen API)

Dies funktioniert gut, wenn ich die URL in meinen Browser stecke (weil ich bei GDOCs angemeldet bin und die Cookies eingestellt sind).

Wenn ich in meinem Google Mail -Gerät über die URL oben greife, habe ich wohl 2 Optionen.

  1. Laden Sie es über Ajax
  2. Laden Sie es direkt im PHP, das das Gerät erzeugt

Mit dem ersten Ansatz, den ich auf das Problem stoße, sind die Cookies im AJAX -Aufruf nicht bekannt (ich denke, dies liegt an verschiedenen beteiligten Domänen).

Hintergrundinformationen: Mein Gadget-Php-Script wird bei meinem Host ausgeführt (https://sslsites.de) Dieses Gerät wird von Google Mail geladen und bietet durch einen Proxy (so dass der Host meines Gadgets innerhalb des Iframe ist http://kipb0cvv7sa9gunc3o5eii57sr1eoem5-a-Gm-openocial.googleusercontent.com/gadgets). Wobei die URL in der Standortleiste (der IFrames -Elternteil) ist https://mail.google.com/mail

Daher kann ein Ajax -Anruf von diesem Iframe keine Cookies an die Domain senden https://spreadsheets.google.com . Recht? Die Antwort ist leer.

Dann habe ich den zweiten Ansatz ausprobiert. Wenn ich von PHP auf die Tabelle zugreifen möchte, brauche ich OAuth. Was mit diesem Code gut funktioniert:

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

Aber auch hier habe ich das Problem mit den Domains hier. Dieser Code läuft gut auf https://sslsites.de . Aber aus Google Mail habe ich das Problem, dass ich das $ _cookie ['Token' nicht bestehen kann]. Wenn ich mich registriere https://sslsites.de Mit OAuth passt mein Browser das Cookie nicht über Google Mails Gadget -Proxy. Wenn ich den Proxy registriere (http://kipb0cvv7sa9gunc3o5eii57sr1eoem5-a-Gm-openocial.googleusercontent.com/gadgets) Es hat sich für OAuth, der Cookie, da, aber mein PHP -Skript weiß es auch nicht.

Gibt es also eine Möglichkeit, den Cookie durch den Proxy zu übergeben (welche Nähte wie eine schwarze Box für mich, weil ich keine Dokumentation darüber finden kann)?

Oder gibt es andere APIs, um auf Tabellenkalkulationen zuzugreifen? Die Tabellenkalkulationen, über die ich spreche, sind für alle öffentlich, daher würde ich nicht erwarten, dass man sich authentifizieren muss.

Die Tabelle ist jedoch öffentlich:https://spreadsheets.google.com/ccc?key=0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc&hl=en&authkey=cj2ppjsp

Aber nicht die Daten -API -Aufruf auf denselben:https://spreadsheets.google.com/feeds/cells/0aj3x4n7sopmrdfa2vmjuampiudfzdlawruwtsejacmc/od6/private/full

War es hilfreich?

Lösung

Ich habe endgültig herausgefunden, wie man OAuth innerhalb der Geräte benutzt.

Sie müssen es in den Gadgets XML wie folgt definieren:

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

Dann können Sie die Tabellenkalkulationsfeeds abfragen:

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
    }
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top