我想从谷歌获取访问令牌。谷歌API说,要获得访问令牌,将代码和其他参数发送到令牌生成页面,响应将是一个JSON对象,如:

{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}

但是,我没有收到刷新令牌。我的回答是:

{
 "access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}

当前回答

使用离线访问和提示:同意对我来说很有效:

   auth2 = gapi.auth2.init({
                    client_id: '{cliend_id}' 
   });

   auth2.grantOfflineAccess({prompt:'consent'}).then(signInCallback); 

其他回答

现在谷歌已经拒绝了这些参数在我的请求(access_type,提示)…:(并且根本没有“撤销访问权限”按钮。我很沮丧,因为回到我的refresh_token lol

更新: 我在这里找到了答案:D,您可以通过请求获得刷新令牌 https://developers.google.com/identity/protocols/OAuth2WebServer

curl -H "Content-type:application/x-www-form-urlencoded" \ https://accounts.google.com/o/oauth2/revoke?token={牌} 令牌可以是访问令牌,也可以是刷新令牌。如果令牌是访问令牌,并且它有相应的刷新令牌,则刷新令牌也将被撤销。 如果成功地处理了撤销,则响应的状态码为200。对于错误条件,将返回状态代码400和错误代码。

1. 如何获得'refresh_token' ?

解决方案:access_type='offline'选项应该在生成authURL时使用。 来源:为Web服务器应用程序使用OAuth 2.0

2. 但即使有'access_type=offline',我没有得到'refresh_token' ?

解决方案:请注意,您只会在第一次请求时获得它,所以如果您将它存储在某个地方,并且在您的代码中有一个条款可以在上次过期后获得新的access_token时覆盖它,那么请确保不要覆盖这个值。

From谷歌Auth Doc:(this value = access_type)

该值指示谷歌授权服务器返回一个 刷新令牌和访问令牌,第一次您的应用程序 将授权代码交换为令牌。

如果你再次需要'refresh_token',那么你需要按照Rich Sutton的回答中所写的步骤删除对应用程序的访问。

将access_type=offline添加到授权谷歌授权URL对我来说很有用。我使用Java和Spring框架。

下面是创建客户端注册的代码:

return CommonOAuth2Provider.GOOGLE
                    .getBuilder(client)
                    .scope("openid", "profile", "email", "https://www.googleapis.com/auth/gmail.send")
                    .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
                    .authorizationUri("https://accounts.google.com/o/oauth2/v2/auth?access_type=offline")
                    .clientId(clientId)
                    .redirectUriTemplate("{baseUrl}/{action}/oauth2/code/{registrationId}")
                    .clientSecret(clientSecret)
                    .build();

这里重要的部分是授权URI,将?access_type=offline追加到该URI。

在我意识到添加access_type=offline是在前端客户端对授权代码的请求上完成的,而不是在将该代码交换为access_token的后端请求上完成的之后,Rich Sutton的回答终于对我有用了。我给他的回答加上了一条评论,并在谷歌上添加了这个链接,以获取有关刷新令牌的更多信息。

注:如果你正在使用Satellizer,下面是如何将该选项添加到$authProvider。AngularJS中的谷歌。

My solution was a bit weird..i tried every solution i found on internet and nothing. Surprisely this worked: delete the credentials.json, refresh, vinculate your app in your account again. The new credentials.json file will have the refresh token. Backup this file somewhere. Then keep using your app until the refresh token error comes again. Delete the crendetials.json file that now is only with an error message (this hapenned in my case), then paste you old credentials file in the folder, its done! Its been 1 week since ive done this and had no more problems.