获取null刷新令牌

时间:2012-04-24 08:11:28

标签: oauth google-api google-api-java-client

我正在使用google-api-java-client版本1.8-beta对Google帐户进行oAuth2身份验证。一切都很好,直到我得到GoogleTokenResponse对象,该对象具有访问令牌但不具有刷新令牌。 要构建请求URL,我使用以下方法:

...
    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"}

请问你能解释一下这个问题吗?非常感谢你的帮助!

3 个答案:

答案 0 :(得分:4)

在构建请求Url时,您应该设置访问类型:

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

如此page设置中所述,建议使用此参数:

  

[...]我们建议您明确设置access_type参数   离线,因为我们预计在线价值时   介绍,它将作为默认行为。这可能会导致   应用程序中的意外更改,因为它会影响方式   您的应用程序可以刷新访问令牌。通过   明确地将参数值设置为离线,您可以避免任何   应用程序功能的变化。 [...]

答案 1 :(得分: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" 
}; 

答案 2 :(得分:0)

对于从谷歌搜索到这里的人来说,我没有使用纯服务器端流程,所以通过javascript获取授权令牌,如doc,@ PatlPincel回答对我来说是一个提示。

您应该将 data-accesstype ="离线" 添加到您的按钮,如下面的代码段所示:

示例:

          <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>