2015-07-07 14 views
9

Google Plus'ı oturum açma olarak kullanıyorum. Artık kullanıcı artık çıkış yapamaz. Geri arama, kullanıcının imzaladığına göre çalışır ve geri döner, ancak bundan sonra kullanıcıyı tekrar hemen imzalar. Çıkışı saklamıyormuş gibi görünüyor.gapi.auth.signOut() değişiklik yapılmadan çalışmayı durdurdu

Bunun gibi birkaç eski soru var örneğin this one. Önerilen tüm çözümleri denedim ama hiçbir şey işe yaramadı. (Giriş yaptığında gizli) her zaman görüntülenir html kafası

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

Düğme kodu, içinde

Kod

<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 ve SignOut fonksiyonu

<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, kullanıyorum bu yeni ve gelişmiş yöntemi kontrol ettiniz mi? cevabımı düzenledim ve sorununuzu çözmeli. Farklı bir şekilde çözdüyseniz, lütfen çözümünüzü gönderin, farklı yaklaşımları incelemek istiyorum. Kim tekerleği kare versiyonunu yeniden icat etmediğimi söylüyor? –

+1

Merhaba Tony, cevap eklediğiniz için teşekkürler. Temel olarak tüm javascript uygulamasından kurtulmak için arka uç yetkilendirmesine geçerek çözdüm. Ne yazık ki çözümünüzü doğrulayamıyorum. – Vincent

+0

, @vincent gibi görünüyor, birkaç kişi çözümünüzü kontrol ediyor ve onayladı. Olumsuz yorumlama yapmadığım için, ödülün sonucundan memnunum. –

cevap

3

DÜZENLEME: İki adımlı bir yaklaşım kullanarak tam oturum kapatma ve oturum açma işlemini gerçekleştirin: önce ben oturum açın ve sonra mevcut sayfayı kapatıyorum ve geçerli oturumu sonlandıran bir çıkış php sayfasını açın (Ajax'ı kullanabilirdim, ancak oturumdan sonra kullanıcıyı ana sayfaya göndermeyi tercih ederim, o zaman neden rahatsız oluyorsunuz?).

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

bu benim SignOut (üretim), nihai sürümü için, sana

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

NOT konsol günlüğünü kaldırmanız önerilir: ayıklama amacıyla, i php'den konsola yazdırmak için bir işlev içerdi (firefox'ta veya kromda konsolu görüntülemek için SHIFT + CTRL + J'yi tıklatın). Bunu yapmak için standart bir uygulama değildir ve son kod başlatıldığında kaldırılmalıdır.

+2

Bunu yaparsam, "Uncanught TypeError: undefined" getAuthInstance 'özelliği okunamıyor "alıyorum. – Vincent

+0

Komut dosyası kütüphanesini değiştirdiniz mi? Çalıştığım bir kodu düzenledim ve yayınladım. –

İlgili konular