2

我正在使用 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"}

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

4

3 回答 3

5

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

requestUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId, callBackUrl, scopes)
    .setApprovalPrompt("force") // needed if user already granted permission
    .setAccessType("offline")
    .build();

本页所述,建议设置此参数:

[...] 我们建议您将 access_type 参数显式设置为离线,因为我们预计当引入 online 值时,它将作为默认行为。这可能会导致您的应用程序发生意外更改,因为它会影响您的应用程序被允许刷新访问令牌的方式。通过将参数值显式设置为脱机,您可以避免对应用程序功能进行任何更改。[...]

于 2012-04-25T09:52:33.790 回答
2

除了 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" 
}; 
于 2014-03-20T14:47:44.923 回答
0

对于从谷歌搜索到这里的任何人,我没有使用纯服务器端流程,因此通过 javascript 获取授权令牌,就像在这个文档中一样,@PapelPincel 的答案对我来说是一个提示。

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

例子:

          <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>
于 2014-04-26T20:19:43.010 回答