2015-07-07 13 views
9

मैं लॉगिन के रूप में Google प्लस का उपयोग कर रहा हूं, जो हाल ही में ठीक काम करता है। अब उपयोगकर्ता अब लॉग आउट नहीं कर सकता है। कॉलबैक काम करता है और रिटर्न देता है कि उपयोगकर्ता साइन आउट हो गया है, हालांकि उसके बाद यह तुरंत उपयोगकर्ता को फिर से संकेत देता है। ऐसा लगता है कि यह लॉगआउट को संग्रहीत नहीं कर रहा है।gapi.auth.signOut() लागू किए गए परिवर्तनों के बिना काम करना बंद कर दिया

इस पर कुछ पुराने प्रश्न हैं उदाहरण के लिए this one। मैंने सभी प्रस्तावित समाधानों की कोशिश की लेकिन कुछ भी काम नहीं किया।

एचटीएमएल सिर

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

बटन कोड है, जो हमेशा प्रदर्शित किया जाता है (छुपा लॉग इन) में कोड

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

साइन इन और प्रस्थान करें समारोह

<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

हे vincent, क्या आपने इस नई और बेहतर विधि का उपयोग किया है जिसका उपयोग मैं कर रहा हूं? मेरा जवाब संपादित किया और इसे आपकी समस्या का समाधान करना चाहिए। यदि आपने इसे अलग हल किया है, तो कृपया अपना समाधान पोस्ट करें, मैं विभिन्न दृष्टिकोणों की जांच करना चाहता हूं। कौन कहता है कि मैं पहिया वर्ग संस्करण को पुनर्निर्मित नहीं कर रहा हूं? –

+1

हाय टोनी, एक उत्तर जोड़ने के लिए धन्यवाद। मैंने इसे बैकएंड प्रमाणीकरण में स्विच करके हल किया, मूल रूप से पूरे जावास्क्रिप्ट कार्यान्वयन से छुटकारा पा लिया। दुर्भाग्य से मैं आपके समाधान की पुष्टि नहीं कर सकता। – Vincent

+0

यह ठीक है @vincent, ऐसा लगता है कि कुछ लोगों ने समाधान की जांच की और इसे मंजूरी दे दी। चूंकि मुझे कोई नकारात्मक समीक्षा नहीं मिली है, इसलिए मैं बकाया राशि के परिणाम से खुश हूं। –

उत्तर

3

संपादित करें: मैं दो चरण दृष्टिकोण का उपयोग करके पूर्ण लॉगआउट और साइनआउट प्राप्त करें: पहले मैं साइनआउट करता हूं और फिर मैं वर्तमान पृष्ठ बंद करता हूं और एक लॉगआउट php पेज खोलें जो वर्तमान सत्र को समाप्त करता है (मैं अजाक्स का उपयोग कर सकता हूं, लेकिन मैं लॉगआउट के बाद उपयोगकर्ता को होमपेज पर भेजना पसंद करता हूं, तो परेशान क्यों?)।

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

यह मेरी प्रस्थान करें (उत्पादन), अंतिम संस्करण के लिए, मैं सुझाव है कि आप कंसोल लॉगिंग को दूर

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

नोट: डिबगिंग प्रयोजनों के लिए, मैं php से कंसोल को प्रिंट करने के लिए एक फ़ंक्शन शामिल किया गया है (फ़ायरफ़ॉक्स में या क्रोम में कंसोल देखने के लिए SHIFT + CTRL + J पर क्लिक करें)। ऐसा करने के लिए मानक अभ्यास नहीं है और अंतिम कोड लॉन्च होने के बाद इसे हटाया जाना चाहिए।

+2

यदि मैं ऐसा करता हूं, तो मुझे "अनकॉटेड टाइप एरर मिल रहा है: अपरिभाषित" getAuthInstance 'प्रॉपर्टी नहीं पढ़ सकता है। – Vincent

+0

क्या आपने स्क्रिप्ट लाइब्रेरी को बदल दिया? मैंने एक कोड संपादित किया और पोस्ट किया जो काम कर रहा है। –

संबंधित मुद्दे