2015-07-07 10 views
9

Ich benutze Google Plus als Login, was bis vor kurzem funktioniert hat. Jetzt kann sich der Benutzer nicht mehr abmelden. Der Rückruf funktioniert und gibt zurück, dass der Benutzer abgemeldet ist. Danach wird der Benutzer jedoch sofort erneut angemeldet. Es scheint, als würde es das Abmelden nicht speichern.gapi.auth.signOut() funktioniert nicht mehr ohne Änderungen implementiert

Es gibt ein paar ältere Fragen dazu wie zum Beispiel this one. Ich habe alle vorgeschlagenen Lösungen ausprobiert, aber nichts hat funktioniert.

Code im HTML-Kopf

<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script> 

Button-Code, die immer angezeigt wird (ausgeblendet, wenn angemeldet)

<div id="signinButton"> 
    <span class="g-signin" 
    data-scope="https://www.googleapis.com/auth/gmail.readonly" 
    data-clientid="{{ CLIENT_ID }}" 
    data-redirecturi="postmessage" 
    data-accesstype="offline" 
    data-cookiepolicy="single_host_origin" 
    data-callback="signInCallback"> 
    </span> 
</div> 

SignIn und SignOut Funktion

<script> 
    function signInCallback(authResult) { 
    //console.log(authResult) 
    if (authResult['code']) { 

     var state = encodeURIComponent('{{ STATE }}'); 
     var code = encodeURIComponent(authResult['code']);   
     var tz = encodeURIComponent($('#timezone').val()); 
     var cntry = encodeURIComponent($('#country').val()); 
     var lan = encodeURIComponent('{{ language }}'); 

     // Send the code to the server 
     $.ajax({ 
     type: 'POST', 
     url: '/signup/gauth', 
     contentType: 'application/octet-stream; charset=utf-8', 
     success: function(result) { 
      console.log(result) 
      if (result == 'Success') { 
      {% if not user %}window.location = "/user/home";{% else %} 
      console.log('Logged in');{% endif %} 
      } 
     }, 
     processData: false, 
     data: 'code='+code+'&state='+state+'&country='+cntry+'&tz='+tz+'&language='+lan 
    }); 
    } 
    else if (authResult['error']) { 
     console.log('Sign-in state: ' + authResult['error']); 
    } 
    } 

    function signOut() { 
    gapi.auth.signOut(); 
    window.location = "/user/logout" 
    } 
</script> 
+0

hey vincent, haben Sie diese neue und verbesserte Methode, die ich verwende, überprüft? redigierte meine Antwort und es sollte dein Problem lösen. Wenn Sie es anders gelöst haben, bitte posten Sie Ihre Lösung, ich möchte verschiedene Ansätze untersuchen. Wer sagt, dass ich die Radquadratversion nicht neu erfinde? –

+1

Hallo Tony, danke für das Hinzufügen einer Antwort. Ich löste es, indem ich zur Backend-Berechtigung wechselte, im Grunde, die gesamte Javascript-Implementierung loszuwerden. Ich kann Ihre Lösung leider nicht bestätigen. – Vincent

+0

das ist in Ordnung @ Vincent, scheint wie ein paar Leute die Lösung überprüft und genehmigt. Da ich keine negative Bewertung habe, bin ich trotzdem mit dem Ergebnis der Bounty zufrieden. –

Antwort

3

EDIT: I vollständige Abmeldung und Abmeldung mithilfe eines zweistufigen Ansatzes: Zuerst signiere ich und schließe dann die aktuelle Seite und öffne eine Logout-PHP-Seite, die die aktuelle Sitzung beendet (ich könnte Ajax verwenden, aber ich ziehe es vor, den Benutzer nach dem Abmelden zur Startseite zu schicken, also warum?).

<head> 
    <meta name="google-signin-scope" content="profile email"> 
    <meta name="google-signin-client_id" content="your-CLIEntID"> 
    <script src="https://apis.google.com/js/platform.js" async defer> 
    </script> 
    <script> 
    function signOut() { 
     var auth2 = gapi.auth2.getAuthInstance(); 
     auth2.signOut().then(function() { 
     console.log('User signed out.'); 
     }); 
    } 
    </script> 
</head> 
<body> 
... 
    <a href='logout.php' onclick='signOut();'>LOGOUT</a> 
... 

das ist mein SignOut (Produktion), für die endgültige Version, empfehle ich, dass Sie die Konsolenprotokollierung

var auth2 = gapi.auth2.getAuthInstance(); 
auth2.signOut(); 

logout.php

<?php 
ob_start(); 
session_start(); 
$serverName = $_SERVER['SERVER_NAME']; 
$tokenGoogle = $_POST['myTokenFromGoogle']; 
if ($tokenId) { 
    debug_to_console("inside LOGOUT has tokenGoogle [$tokenGoogle]"); 
    $url = "https://accounts.google.com/o/oauth2/revoke?token=$tokenGoogle"; 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $response = curl_exec($ch); 
    $json = json_decode($response, true); 
    curl_close($ch); 
    header("Location: http://$serverName/pageThatConsumesdata.php?".implode("|",$json)); 
} else { 
    debug_to_console("inside LOGOUT HAVING NO tokenGoogle"); 
    if(isset($PHPSESSID)) { 
     $message = "time for a change of ID? ($PHPSESSID)."; 
     $sessionName = session_id(); 
     session_regenerate_id(); 
     $sessionName2 = session_id(); 
    } else { 
     $message = "There was no session to destroy!"; 
    } 
    debug_to_console($message); 
    debug_to_console("[$serverName]"); 
    session_destroy(); 
    header("Location: http://".$serverName); 
    exit; 
} 
function debug_to_console($data) { 
    if (is_array($data)) { 
    $output = "<script>console.log('" . implode(',', $data) . "');</script>"; 
    } else { 
    $output = "<script>console.log('" . $data . "');</script>"; 
    } 
    echo $output; 
} 
?> 

HINWEIS entfernen: Für Debugging-Zwecke, i haben eine Funktion zum Drucken auf Konsole von PHP enthalten (klicken Sie auf UMSCHALT + STRG + J, um die Konsole in Firefox oder in Chrome anzuzeigen). Dies ist in der Regel keine Standardpraxis und sollte entfernt werden, sobald der endgültige Code veröffentlicht wurde.

+2

Wenn ich das mache, bekomme ich "Uncaught TypeError: Kann die Eigenschaft 'getAuthInstance' von undefined nicht lesen". – Vincent

+0

haben Sie die Skriptbibliothek geändert? Ich habe einen Code bearbeitet und gepostet, der funktioniert. –