2012-04-24 286 views
2

我正在使用google-api-java-client版本1.8-beta進行oAuth2身份驗證與Google帳戶。一切正常,直到我得到GoogleTokenResponse對象,它具有訪問令牌但沒有刷新令牌。 要構建請求URL我的用戶下面的方法:獲取null刷新令牌

... 
    googleAuthenticationUrl = new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, callBackUrl, scopes).build(); 
... 

當獲取請求令牌我在此行中訪問輔幣:

... 
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, request.getParameter(CODE_URL_PARAM), callBackUrl).execute(); 
... 

返回GoogleTokenResponse對象不包含刷新令牌:

{"access_token":"ya29.AH..etc...9-Y","expires_in":3600,"token_type":"Bearer"} 

您能否在這個問題上拋出我的光芒?非常感謝您的幫助!

回答

4

在構建請求URL,您應該設置訪問類型:

requestUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId, callBackUrl, scopes).setAccessType("offline").build(); 

在本page描述的設置建議使用此參數:

[...]我們建議您明確地將access_type參數 設置爲離線,因爲我們預計當引入在線值 時,它將作爲默認行爲。這可能會導致 應用程序發生意外更改,因爲它會影響您的應用程序允許刷新訪問令牌的方式 。通過 將參數值明確設置爲脫機,可以避免應用程序功能發生任何變化。 [...]

+0

在GoogleAuthorizationCodeFlow.Builder:升級警告:之前的1.10版本默認爲{@code「offline」}。但是,從版本1.10開始,它是{@code null},這意味着用於Web應用程序的「在線」代碼。爲了保持先前的行爲,您需要顯式調用setAccessType(「offline」)}。 – koma 2012-08-19 01:27:01

+0

如果你(PapelPincel)寫的(取自Google開發者頁面)是正確的,我會說這不足以「在令牌過期前自動刷新令牌」(如https://developers.google.com/oauthplayground/說的)。那麼,如何在後臺刷新訪問令牌,而不要求其他時間給用戶做出新的授權? – Aerox 2014-06-09 20:04:42

1

除了PapelPincel的回答,我還必須使用.Net 版本1.8.1.970強制批准提示以獲取刷新令牌。例如

var authReq = new GoogleAuthorizationCodeRequestUrl(new Uri(GoogleAuthConsts.AuthorizationUrl)) { 
    RedirectUri = Callback, 
    ClientId = ClientId, 
    AccessType = "offline", 
    Scope = string.Join(" ", new[] { Scopes... }), 
    ApprovalPrompt = "force" 
}; 
0

對於任何人,我沒有使用純粹的服務器端的流量來自谷歌搜索到這兒,所以漸漸通過javascript授權令牌在此doc,@PapelPincel答案是對我的暗示。

你應該數據接入類型=「離線」你的按鈕,下面的代碼片段添加:

例子:

  <span 
      data-accesstype="offline" 
      class="g-signin" 
      data-callback="signinCallback" 
      data-clientid="CLIENT_ID" 
      data-redirecturi="postmessage" 
      data-cookiepolicy="single_host_origin" 
      data-requestvisibleactions="http://schemas.google.com/AddActivity" 
      data-scope="https://www.googleapis.com/auth/plus.login"> 
      </span>