2012-04-24 192 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>