2014-12-02 62 views
3

我有下面的代碼片段:Google+上的oauth2回調多次觸發

var myParams = { 
'clientid' : 'XXXXX.apps.googleusercontent.com', 
'cookiepolicy' : 'single_host_origin', 
'callback' : _.bind(function(response){ this._loginGoogleCb(response); }, this), 
      'scope' : 'https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/plus.profile.emails.read', 
      'requestvisibleactions' : 'http://schemas.google.com/AddActivity' 
     }; 
gapi.auth.signIn(myParams); 

我第一次單擊該按鈕,該代碼得到執行,沒有任何問題。
但是當我第二次點擊按鈕時,回調(並且只有回調)被執行兩次。
每次執行此代碼時,對Google服務器的請求數(以及相關回調)增加1.

我重複檢查,調用函數本身只在重複時執行一次。
單擊按鈕本身不是問題。

任何想法可能是什麼問題?

+0

是否有可能爲您的頁面添加小提琴,以查看您面臨的問題到底是什麼......或者您如何確認這是服務器的回調,隨着每次點擊而增加......一點點更多的代碼片段也會有所幫助。正如我所知道的那樣,當你使用JavaScript做Oauth時,它是一次授權,所以當你第一次做Oauth時,它會顯示你基本接受或拒絕的同意屏幕。從第二次起,彈出窗口仍然出現,但是你不需要做任何事......它會拾取並獲取訪問令牌。因此彈出窗口每次出現 – 2014-12-05 22:11:40

+0

我在這裏創建了一個小提琴:http://jsfiddle.net/ g1mjLkgp /但這可能不會有太大的幫助,因爲原點不匹配。問題「已解決」,因爲用戶將在退出後始終返回主頁並刷新頁面。然而,這是一個可悲的解決方案,但現在解決了這個問題。 – Trace 2014-12-06 00:24:25

回答

2

正如從this文章中可以看出,有三種不同狀態的方法:

  • PROMPT
  • AUTO

在授權對象:

{ 
    "id_token": string, 
    "access_token": string, 
    "expires_in": string, 
    "error": string 
    "status": { /* object */ 
    "google_logged_in" : boolean, 
    "signed_in" : boolean, 
    "method" : string /* null, PROMPT, or AUTO */ 
    } 
} 

發生的情況是,當您第一次登錄時,只是觸發了其中一種狀態方法(「PROMPT」),但當您再次按下該按鈕時,會觸發兩種狀態方法(「PROMPT」和「AUTO 「)。

用於處理這些狀態方法的示例「signinCallback」代碼可以找到here

此外,如果您多次調用下劃線的綁定函數,那麼綁定函數也將被多次調用。因此,您看到「對Google服務器的請求數量(以及相關回調)隨着1而增加的原因。」我建議封裝這個調用來綁定另一個函數,並且包含一個警戒條件來阻止這個被多次調用。

+1

感謝您的回答。那麼我有回調代碼,但是我擔心的是,它會被觸發的次數越來越多,每次在沒有頁面刷新的情況下退出後,我都會重新登錄。在檢查狀態之前,我可以通過使用console.log來輕鬆檢查。 – Trace 2014-12-08 13:55:01

+0

您是否在簽入時檢查了授權對象中的「錯誤」變量(儘管我懷疑是否有錯誤,無論如何都值得檢查)。後續登錄中「方法」的價值是什麼?此外,觸發次數越來越多這一事實聽起來就是回調代碼重新註冊多次的症狀;你確定你只註冊一次回調? – 2014-12-08 14:11:23

+0

是的,沒有錯誤,並且隨後的調用都具有狀態方法「PROMPT」。確實看起來我多次註冊回調,但我不確定如何只註冊一次。正如我在問題中的代碼所表明的那樣,它只是我傳遞給'gapi.auth.signIn(myParams);'的每一次我想再次登錄的參數數組。 – Trace 2014-12-08 14:47:27