2015-09-09 61 views
0

我在我的Rails項目中使用了google-api-client gem。我有omniauth和設計工作,我有用戶通過谷歌認證。Google API客戶端:令牌已被撤銷問題

直到最近,我還以爲自己這樣做很順利。我注意到,我的應用在一小時後提取Google Calendar API時會產生錯誤。到期是認證時間一小時,然後從我得到這個錯誤:

Signet::AuthorizationError (Authorization failed. Server message: 
{ 
    "error" : "invalid_grant", 
    "error_description" : "Token has been revoked." 
}): 

這是無效的刷新令牌分開,因爲我有存儲在數據庫中刷新令牌。它發送刷新令牌請求,其中馬刺上面的錯誤,使用此代碼:

client = Google::APIClient.new(
    :application_name => APP_NAME, 
    :application_version => APP_VERSION, 
) 

client.authorization.client_id = CLIENT_ID 
client.authorization.client_secret = CLIENT_SECRET 

client.authorization.refresh_token = user.auth_refresh_token 
token_result = client.authorization.fetch_access_token! 

我一直很小心,不要登錄和註銷我的谷歌帳戶,所以我無法弄清楚,爲什麼谷歌會發回這條消息。如果55分鐘後刷新頁面,一切正常。如果我在1小時後刷新頁面,它會抱怨被取消的訪問令牌。

有沒有人有過這個問題?如果是這樣,你做了什麼來解決它?是不是在Google的開發人員控制檯中必須更改?

+0

你有沒有解決這個問題?有相同的問題。 –

+0

@mederomuraliev我說從我記得,當我解決了這個問題的答案。希望它有幫助。 – JakeLarson

回答

1

我最終搞清楚了這個問題,所以我想我會分享一下解決問題的方法。

在配置/初始化/ devise.rb,我有:

scope: 'userinfo.profile, userinfo.email, calendar, https://www.googleapis.com/auth/gmail.readonly', prompt: 'select_account consent' } 

那有什麼對我來說是prompt: 'select_account consent'部分。在每次登錄時詢問用戶是否同意刷新令牌是最新的。當用戶通過Google登錄時,我會檢查響應中是否有刷新令牌,如果有,我將其保存到數據庫中。如果不是,我將他們當前的刷新標記保存在數據庫中。

說實話,我真的不明白爲什麼有必要爲我做到這一點,但對於誰已經分享了他們的代碼示例其他用戶感覺不錯。也許Google的OAuth2發生了變化,或者我的處理授權的方法可能存在差異。

+1

太棒了。謝謝您的回答。我能解決我的問題,我基本上必須重新生成令牌,因爲密碼已更改並被撤消。任何人都會遇到這個問題。 –

相關問題