2015-07-07 17 views
9

Sto utilizzando Google Plus come login, che ha funzionato fino a poco tempo fa. Ora l'utente non può più uscire. Il callback funziona e restituisce che l'utente è stato disconnesso, ma dopo di ciò esegue immediatamente la registrazione dell'utente. Sembra che non stia memorizzando il logout.gapi.auth.signOut() ha smesso di funzionare senza modifiche implementate

Ci sono alcune vecchie domande su questo come ad esempio this one. Ho provato tutte le soluzioni proposte ma non ha funzionato.

Codice in testa html

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

codice del pulsante, che viene sempre visualizzata (nascosto quando connesso)

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

funzione SignIn e SignOut

<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, hai verificato questo metodo nuovo e migliorato che sto usando? ho modificato la mia risposta e dovrebbe risolvere il tuo problema. se l'hai risolto in modo diverso, per favore pubblica la tua soluzione, mi piacerebbe esaminare diversi approcci. Chi dice che non sto reinventando la ruota - versione quadrata? –

+1

ciao Tony, grazie per aver aggiunto una risposta. Ho risolto il problema passando all'autorizzazione di back-end, praticamente eliminando l'intera implementazione di javascript. Purtroppo non posso confermare la tua soluzione. – Vincent

+0

va bene @vincent, sembra che un paio di persone abbiano controllato la soluzione e l'abbiano approvata. Dal momento che non ho avuto recensioni negative, sono contento del risultato della ricompensa a prescindere. –

risposta

3

EDIT: ho ottenere logout completo e signout usando un approccio a due fasi: prima i signout e poi chiudo la pagina corrente e aprire una pagina php di logout che termina la sessione corrente (potrei usare Ajax, ma preferisco mandare l'utente alla home page dopo il logout, quindi perché preoccuparsi?).

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

questo è il mio SignOut (produzione), per la versione finale, vi consiglio di rimuovere la registrazione della console

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

NOTA: Per scopi di debugging, i ho incluso una funzione per la stampa su console da php (clicca MAIUSC + CTRL + J per visualizzare la console in firefox o in chrome). non è affatto una pratica standard farlo e dovrebbe essere rimosso una volta lanciato il codice finale.

+2

Se lo faccio, ricevo "Uncaught TypeError: Impossibile leggere la proprietà 'getAuthInstance' di undefined". – Vincent

+0

hai cambiato la libreria di script? ho modificato e pubblicato un codice che funziona. –

Problemi correlati