2014-10-19 17 views
7

Tôi đang thử làm theo hướng dẫn của Google+ để bắt đầu luồng Đăng nhập bằng Google+ bằng nút của riêng tôi.Google+ Đăng nhập bằng JavaScript - gọi lại hai lần ngay lập tức

Liên quan đến hàm callback, các gapi.auth.signIn tài liệu tham khảo cho biết (trích dẫn):

"Một chức năng trong không gian tên toàn cầu, được gọi là khi nút đăng nhập được trả lại và cũng được gọi sau khi luồng đăng nhập hoàn tất. "

Google Đăng trong hộp thoại xuất hiện, yêu cầu tôi đăng nhập, nhưng khi gọi lại được gọi là hai lần ngay, trước khi bất kỳ sự tương tác được thực hiện với hộp thoại. Cả hai lần tôi nhận được một authResult tương tự, với error = "immediate_failed", error_subtype = "access_denied", status.signed_in = false

Tại sao lại như vậy?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
    <meta http-equiv=Content-Type content="text/html; charset=utf-8" /> 
    <script src="https://apis.google.com/js/client:platform.js?onload=googleRender" async defer></script> 
    </head> 
    <body> 

<script> 
    function googleRender() { // executed when Google APIs finish loading 
    var googleSigninParams = { 
     'clientid' : '746836915266-a016a0hu45sfiouq7mqu5ps2fqsc20l4.apps.googleusercontent.com', 
     'cookiepolicy' : 'http://civoke.com', 
     'callback' : googleSigninCallback , 
     'requestvisibleactions' : 'http://schema.org/AddAction', 
     'scope' : 'https://www.googleapis.com/auth/plus.login' 
    }; 
    var googleSigninButton = document.getElementById('googleSigninButton'); 
    googleSigninButton.addEventListener('click', function() { 
     gapi.auth.signIn(googleSigninParams); 
    }); 
    } 
    function googleSigninCallback(authResult) { 
    console.log('googleSigninCallback called: '); 
    console.dir(authResult); 
    if (authResult['status']['signed_in']) { 
     document.getElementById('googleSigninButton').setAttribute('style', 'display: none'); // hide button 
     console.log('User is signed-in to Google'); 
    } else { 
     console.log('User is NOT signed-in. Sign-in state: ' + authResult['error']); 
    } 
    } 
</script> 

<button id="googleSigninButton">Sign in with Google</button> 

    </body> 
</html> 

Trả lời

7

chức năng gọi lại được gọi là luôn khi tình trạng đã thay đổi, không chỉ khi người dùng đăng nhập. Trong googleSigninCallback(authResult), bạn nên vào kiểm tra đầu tiên nếu người dùng đã đăng nhập và sau đó bạn nên kiểm tra, nếu giá trị phương pháp là AUTO hoặc PROMPT. PROMPT chỉ được trả lại một lần khi người dùng đăng nhập và đó là những gì bạn cần. Đây là mã:

function googleSigninCallback(authResult) { 
    if (authResult['status']['signed_in'] && authResult['status']['method'] == 'PROMPT') { 
     // User clicked on the sign in button. Do your staff here. 
    } else if (authResult['status']['signed_in']) { 
     // This is called when the status has changed and method is not 'PROMPT'. 
    } else { 
     // Update the app to reflect a signed out user 
     // Possible error values: 
     // "user_signed_out" - User is signed-out 
     // "access_denied" - User denied access to your app 
     // "immediate_failed" - Could not automatically log in the user 
     console.log('Sign-in state: ' + authResult['error']); 
    } 
+2

Trước hết, nó hoạt động (cảm ơn). Hai bình luận mặc dù: (1) Khi không 'PROMPT' tôi nhận được null thay vì 'AUTO'; (2) Điều này vẫn không giải thích tại sao nó được gọi là ** hai lần ** vì không có hai thay đổi trạng thái ngay lập tức ... –

+0

Tôi đã xé tóc ra với cái này. Cảm ơn. – Keab42

Các vấn đề liên quan