2013-10-17 65 views
0

我正在開發一個包含兩個簡單頁面和谷歌加集成的原型。我有兩個頁面,第一個帶有「登錄」按鈕,第二個帶有鏈接。當用戶點擊登錄按鈕,我呼籲:Google Plus API調用未驗證

var params = {"client_id":"<client_id>", "scope":"https://www.googleapis.com/auth/plus.login"}; 
gapi.auth.authorize(params, signinCallback); 

signinCallback看起來是這樣的:

var signinCallback = function(authResult) { 
    if (authResult['access_token']) { 
    gapi.auth.setToken(authResult); 

    gapi.client.load('plus','v1', function(){ 
     var request = gapi.client.plus.people.list({ 
     'userId': 'me', 
     'collection': 'visible' 
     }); 

     request.execute(function(resp) { 
     console.log(resp); 
     }); 
    }); 

    } else if (authResult['error']) { 
     console.error('Sign-in state: ' + authResult['error']); 
    } 
} 

所以,當用戶點擊該按鈕,在標誌和提供權限的應用程序,我正在存儲令牌並進行人員列表調用。這一切都很完美。

我的問題是,當我瀏覽到第二頁,並設法使我之前做了相同的呼叫:

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

調用失敗,出現錯誤:Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.

當我做「我還以爲setToken「後,我不必繼續認證每一個後續的電話,我做錯了什麼?

回答

1

如果這是真正的兩個不同的頁面(而不是一個網頁,取得了一些AJAX或其他調用您的服務器,以獲得額外的數據),那麼每一頁都有一個完全不同的JavaScript環境。這意味着gapi對象在每個頁面上是不同的副本,並且您在第一頁上設置的驗證沒有在第二頁上的gapi對象上設置。您沒有爲會話設置令牌 - 您將其設置在特定的JavaScript對象上。

如果您使用的是類似Google+ Sign In的東西,您可以將按鈕放在每個頁面上,並且每個頁面在用戶訪問該頁面時都會獲得自己的標記,但這樣做效率不高,因爲它也意味着往返每次到服務器。

你也許還做這樣的事情把認證令牌到臨時/會話本地存儲,但你應該在這種情況下,該令牌不能泄露出去,使你一個安全問題小心。

還有其他潛在的解決方案,但它真的歸結爲您打算如何使用經過身份驗證的用戶作爲客戶端的一部分。