我正在使用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"}
请问你能解释一下这个问题吗?非常感谢你的帮助!
答案 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>