2013-12-13 206 views
15

我有一個基於Web的應用程序,它使用Google OAuth2.0作爲登錄框架。它以前工作很好,直到昨天。訪問令牌過期後,應用程序無法獲取刷新令牌。除此之外,「請求許可」頁面更改爲「有離線訪問」,而不是「知道您在Google上的人」和「查看您的電子郵件」OAuth 2.0訪問令牌已過期,並且刷新令牌不可用

最初,「請求許可」頁面將要求訪問「瞭解你在Google上的人」和「查看你的電子郵件」。用戶註銷並嘗試第二次登錄後,「請求許可」頁面也將相同。

但是,直到昨天,「請求許可」頁面更改爲「有離線訪問」。訪問令牌過期後,我收到以下錯誤消息:

PHP致命錯誤:未收到的異常'Google_AuthException'帶有消息'OAuth 2.0訪問令牌已過期,並且刷新令牌不可用。刷新令牌不會返回自動批准的響應。 in /home2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

我試過​​。但是,我仍然有這個致命的錯誤。下面是我的代碼獲取訪問令牌:

if ($client->getAccessToken()) { 
     $token = $client->getAccessToken(); 
     $authObj = json_decode($token); 
     $refreshToken = $authObj->refresh_token; 
     $user = $oauth2->userinfo->get(); 
     $me = $plus->people->get('me'); 
     $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2 

     $optParams = array('maxResults' => 100); 
     $activities = $plus->activities->listActivities('me', 'public', $optParams); 


     $_SESSION['access_token'] = $client->getAccessToken(); 
    } else { 
     $authUrl = $client->createAuthUrl(); 
    } 

我試圖尋找像我這樣的類似問題,但我找不到一個。這發生在昨天以來。在此之前,我從未對代碼做過任何修改。

+0

據我所知,他們改變了一點他們的安全管理。如果您現在可以訪問應用程序,那麼Google知道未來,您要求提供哪些權限並將其保存,如果您想擁有新的權限或脫機訪問權限,則只會再詢問一次。我想,這是一個暫時的錯誤,他們一直在更新他們的系統,因爲我現在沒有遇到任何問題。 –

+0

更新:你說得對,我也不能使用刷新標記了... –

+0

你能告訴我如何擺脫這個? – Akilsree1

回答

18

他的評論,Fabian Parzefall幫助我解決這個問題。

這裏是我的腳本:

if($client->isAccessTokenExpired()) { 

    $authUrl = $client->createAuthUrl(); 
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 

} 

這其實很簡單。與其要求他點擊「連接我」按鈕(就像GA API團隊提供的演示腳本一樣),我直接重定向他。 不知道這是否是正確/安全的方式,但這是現在爲我工作的那個!

+0

你能解釋一下,這個解決方案是如何導致API批准你的訪問令牌的? – Rodniko

+0

這段代碼並不是真的需要獲取您的訪問令牌,而只是爲了防止用戶每隔5分鐘就登錄應用程序。 我很抱歉,我長期沒有觸及此代碼,因此我現在無法提供幫助... –

3
if($client->isAccessTokenExpired()) { 

    $client->authenticate(); 
    $NewAccessToken = json_decode($client->getAccessToken()); 
    $client->refreshToken($NewAccessToken->refresh_token); 

    } 
+3

authenticate()要求從認證系統傳回的代碼。 –

+0

我得到了這個工作,但似乎有一個無限循環,因爲我的令牌在頁面加載時會一直到期。 – JBS

2

上面的答案是「正確的」,但我faffed各地制定出在哪裏把它(!)......所以這張貼任何其他人想的是,最終有令牌即將到期的例子(!)。

一旦你的代碼完成了它需要的任何令牌,並且你的客戶端有一個訪問令牌,那麼檢查它是否仍然有效,如果沒有發送給重新授權!

// Stuff to do with getting tokens and storing in session etc... 

if ($client->getAccessToken()) { // Hey! we got one! 
    if($client->isAccessTokenExpired()) { // Oh! its not good - go for another 
     $authUrl = $client->createAuthUrl(); 
     header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 
     exit(); 
    } 
    try{ 
... 
    } 
+0

我不得不取消所有SESSION的保存並通過重定向的令牌和狀態,但我不明白爲什麼我不能只取消保存的令牌。我懷疑這個國家正在與令牌一起使用,但我無法調查它,只好繼續前進。 – imparante