2014-07-02 11 views
5

Ich habe eine HTML5-Anwendung, die die google javascript API verwendet. Ich habe kürzlich festgestellt, dass diese App in einer iframe-Sandbox-Umgebung ausgeführt werden muss. Ich weiß, dass es aussieht, als würde man versuchen, das eigentliche Ziel der Sandbox-Umgebungen zu umgehen. Allerdings sind einige Funktionen für den iframe weiterhin erlaubt (siehe Beschränkungen unten), was mich glauben lässt, dass es etwas Hoffnung gibt.Verwenden Sie die Google-JavaScript-API in einer Sandbox-Iframe-Umgebung

Ich habe Probleme während des Authentifizierungsvorgangs: Wenn geladen, hängt die JavaScript-API von Google einen iFrame auf der ursprünglichen Seite an (was in meinem Fall bereits ein iframe ist) und verwendet einen postMessage-Mechanismus zur Kommunikation zwischen Fenstern. Ich möchte die Google API für den OAuth2.0-Authentifizierungsprozess sowie für die Abfrage der API verwenden.

Hier ist ein Reproduktionsfall; Ich verwende eine vereinfachte Version der authSample.html Seite von Google bereitgestellt.

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset='utf-8' /> 
    <title>original auth page</title> 
</head> 
<body> 
    <button id="authorize-button">Authorize</button> 
    <div id="content">Not authentified</div> 
    <script type="text/javascript"> 
     var clientId = '<use yours>'; 
     var apiKey = '<use yours>'; 
     var scopes = 'https://www.googleapis.com/auth/analytics.readonly'; 
     var authorizeButton = document.getElementById('authorize-button'); 
     var resultDiv = document.getElementById('content'); 
     function handleClientLoad() { 
      gapi.client.setApiKey(apiKey); 
      authorizeButton.onclick = handleAuthClick; 
     } 

     function handleAuthResult(authResult) { 
      if (authResult && !authResult.error) { 
       makeApiCall(); 
      } else { 
       resultDiv.innerHTML = "handleAuthResult Failed"; 
      } 
     } 

     function handleAuthClick(event) { 
      gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false }, handleAuthResult); 
      return false; 
     } 

     function makeApiCall() { 
      gapi.client.load('analytics', 'v3', function() { 
       resultDiv.innerHTML = "api call successful"; 
      }); 
     } 
    </script> 
    <script src="https://apis.google.com/js/client.js?onload=handleClientLoad"></script> 
</body> 
</html> 

Die beinhaltende Seite, die von den Endnutzern verwendet wird, wie folgt aussieht:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset='utf-8' /> 
    <title>iframed page</title> 
</head> 
<body> 
    <iframe id="8D681BA3DED5" width="400px" height="400px" 
      frameborder="0" sandbox="allow-scripts allow-forms allow-same-origin ms-allow-popups allow-popups" marginheight="0" marginwidth="0" 
      name="MyTest" src="https://localhost:4000/AuthSample.html"></iframe> 
</body> 
</html> 

Natürlich werden Sie diese Seite auszuführen, nachdem die tatsächliche src für den iframe von Ihrem Server authSample ersetzen .html URL

Wenn Sie es in verschiedenen Browsern ausführen, werden Sie unterschiedliche Verhaltensweisen für den Fehler bemerken. Ich habe versucht, die Tatsache auszunutzen, dass die Popups erlaubt sind, aber es scheint, dass Browser die Tatsache, dass das geöffnete Fenster auch in einer Sandbox-Umgebung geöffnet werden sollte, anders implementiert haben.

Ich möchte vermeiden, meine eigenen Webservices für die Authentifizierung zu schreiben. Darüber hinaus glaube ich, dass Nutzer ihre Anmeldeinformationen auf der üblichen Google-Webseite (mit einer URL accounts.google.com) sicherer eingeben würden. Wenn Sie eine Idee haben, die mit aktuellen Browsern funktionieren könnte, können Sie sie gerne einreichen.

Danke

Antwort

1

Ich habe eine Lösung gefunden, die Grundidee ist, den Auth-Flow in einem Popup zu tun, die die Sandbox Cross Ursprungssicherheitsbeschränkungen nicht erbt. Tatsächlich ist die Sandbox hat folgende Attribute Sandbox =“allow-Skripte erlauben Formen erlauben-same-origin ms-allow-Popups allow-Pop-ups“

Ich schrieb ein small blog post die Lösung im Detail zu erklären.

EDIT (September 2016):

Bei Keluro veröffentlichten wir eine open source code sample die Anmelde-Formalitäten zu nutzen.Es wird mehr für die Verbindung mit Azure AD/Office 365 verwendet, aber die Clientseite mit dialogApi und das Popup als Fallback kann wiederverwendet werden.

-2

Es ist nicht schwer Benutzer sich zu authentifizieren und müssen nicht als Krücke auf api verlassen. Mit ein paar php mysqli_connect Calls und Zugriff auf die DB via phpmyadmin oder so, können Sie Clients aus erster Hand validieren. Von dort aus können Sie einfach die Datenbank abfragen, um den Benutzer und die zugehörigen Informationen zu finden.

Verwenden Sie die gleiche POST/GET-Methoden, die Sie in Ihrer Form haben, und Sie werden in der Lage einen PHP-Variable in der Form mit action="<?php echo $_SERVER["PHP_SELF"];?>"

Dann in Ihrer PHP-Quelle zu erstellen,

$userid = mysqli_real_escape_string($con,$_POST['FORMID']) 

wo $ con ist Ihre Verbindungszeichenfolge über mysqli_connect

+0

Ihre Antwort beschreibt, wie Sie eine Verbindung zu einer MySQL-Datenbank herstellen, aber das OP versucht speziell, das Google Analytics-API zu verwenden. –