7

我正在嘗試在我們的網站上執行Google登錄。我已經閱讀了文檔並在apis控制檯上設置了一個應用程序。Google身份驗證javascript

我更喜歡在彈出窗口中顯示註冊對話框,並在用戶登錄後接受我將獲得JavaScript回調的權限。這個API也支持根據文檔。因此,我在文檔的幫助下構建了以下內容;-)

第一部分是加載google客戶端腳本異步和init腳本以及正確的clientid和apikey。

$gp = new googlePlus('@Trustpilot.Web.Social.Google.ClientID', '@Trustpilot.Web.Social.Google.ApiKey'); 
(function() { 
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; 
    po.src = 'https://apis.google.com/js/client.js?onload=googlePlusClientLoad'; 
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); 
})(); 

下一部分它使用了谷歌的客戶端API的一部分。 handleClientLoad()在加載client.js時調用。該方法檢查使用是否通過身份驗證。如果用戶是,我的想法是我想登錄用戶。 如果用戶還沒有被認證,將會有一個按鈕,當點擊handleAuthClick()被調用時,它的基本功能與handleClientLoad()相同,但會彈出一個用戶最多登錄(使用谷歌帳戶)和接受權限。登錄後,handleAuthResult()被稱爲登錄用戶。

function googlePlus(clientId, apiKey) { 
    this.clientId = clientId; 
    this.apiKey = apiKey; 
    this.scopes = 'https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email'; 

    /// This method is called when the javascript is loaded async 
    this.handleClientLoad = function() { 
     gapi.client.setApiKey(this.apiKey); 
     window.setTimeout(this.authorize(true), 1); 
    }; 

this.handleAuthResult = function (authResult) { 
    console.log(authResult); 
    if (authResult && !authResult.error) { 
     var token = gapi.auth.getToken(); 
     console.log(token); 
    } 
    else if (authResult && authResult.error) { 
     alert(authResult.error); 
    } 
}; 

this.handleAuthClick = function(event) { 
    this.authorize(false); 
    return false; 
}; 

this.makeApiCall = function() { 
    gapi.client.load('plus', 'v1', function() { 
     var request = gapi.client.plus.people.get({ 
      'userId': 'me' 
     }); 
     request.execute(function (resp) { 
      console.log(resp); 
     }); 
    }); 
}; 

    this.authorize = function (immediate) { 
     gapi.auth.authorize({ client_id: this.clientId, scope: this.scopes, immediate: immediate }, this.handleAuthResult()); 
     //gapi.auth.authorize({ client_id: this.clientId, scope: this.scopes, immediate: immediate }, this.handleAuthResult()); 
    }; 
} 
var googlePlusClientLoad = function() { 
    $gp.handleClientLoad(); 
}; 

所以,現在的問題:

  1. 當handleClientLoad被稱爲如果用戶已經擁有autehnticated用戶從未認證甚至 。
  2. 如果用戶使用handleAuthClick()彈出顯示並登錄,則將權限和回調函數handleAuthResult()工作。但參數authResult是 總是沒有任何東西(應該是讚美文檔的東西)。
  3. 如果我嘗試多次不重新加載頁面,我有時可以通過 獲取makeApiCall()和gapi.auth.getToken()以獲得我需要的信息。
+0

我有使用JavaScript API相同的問題。如果你已經解決了問題,請分享你的答案。 – xrnd

回答

1

有在你的代碼的兩個問題:

  • 不是必需的API密鑰,您可以將其刪除。通過OAuth2獲得用戶令牌就足夠了。
  • authorize()中,handleAuthResult方法未正確調用,請在函數名稱末尾刪除括號。您不想執行該功能,只需傳遞其參考。這裏的authorize方法必須是什麼樣子:

    gapi.auth.authorize({ client_id: this.clientId, scope: this.scopes, immediate: immediate }, this.handleAuthResult);

注意括號中的差異。