68

我已完成授权步骤并获得访问令牌和刷新令牌。

接下来我应该怎么做才能使用我通过谷歌驱动 API 存储的刷新令牌生成访问令牌?

由于我在 Force.com 上工作,因此我将无法使用任何 sdk,因此请建议直接通过 API 实现它的方法。

4

9 回答 9

42

如果您使用的是 web api,那么您应该POST对 URL 进行 http 调用:https://www.googleapis.com/oauth2/v4/token 使用以下请求正文

client_id: <YOUR_CLIENT_ID>
client_secret: <YOUR_CLIENT_SECRET>
refresh_token: <REFRESH_TOKEN_FOR_THE_USER>
grant_type: refresh_token

刷新令牌永不过期,因此您可以多次使用它。响应将是这样的 JSON:

{
  "access_token": "your refreshed access token",
  "expires_in": 3599,
  "scope": "Set of scope which you have given",
  "token_type": "Bearer"
}
于 2016-07-16T18:20:53.663 回答
33

如果您想自己实现,Web 服务器应用程序的 OAuth 2.0 流程记录在https://developers.google.com/accounts/docs/OAuth2WebServer,特别是您应该查看有关使用刷新令牌的部分:

https://developers.google.com/accounts/docs/OAuth2WebServer#refresh

于 2012-05-17T16:17:45.527 回答
29

这是一个老问题,但在我看来它没有完全回答,我也需要这些信息,所以我会发布我的答案。

如果您想使用 Google Api 客户端库,那么您只需要一个包含刷新令牌的访问令牌,然后 - 即使访问令牌将在一小时后过期 - 库也会为您刷新令牌自动地。

为了获得带有刷新令牌的访问令牌,您只需要询问离线访问类型(例如在 PHP: 中$client->setAccessType("offline");),您就会得到它。请记住,您只会在第一次授权时获得带有刷新令牌的访问令牌,因此请务必在第一时间保存该访问令牌,您将可以随时使用它。

希望对任何人都有帮助:-)

于 2015-09-26T16:35:02.573 回答
8

您需要做的就是一个如下的发布请求:-

POST https://www.googleapis.com/oauth2/v4/token
Content-Type: application/json

{
  "client_id": <client_id>,
  "client_secret": <client_secret>,
  "refresh_token": <refresh_token>,
  "grant_type": "refresh_token"
}
于 2019-09-01T07:37:04.213 回答
4

如果您使用 Java,请遵循以下代码片段:

GoogleCredential refreshTokenCredential = new GoogleCredential.Builder()
    .setJsonFactory(JSON_FACTORY)
    .setTransport(HTTP_TRANSPORT)
    .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
    .build()
    .setRefreshToken(yourOldToken);
refreshTokenCredential.refreshToken(); //do not forget to call this
String newAccessToken = refreshTokenCredential.getAccessToken();
于 2018-12-17T10:32:47.313 回答
3

只是发布我的答案以防万一我花了一个小时弄清楚它对任何人都有帮助:)

首先,两个非常有用的链接与 google api 和从任何 google 服务获取数据相关:

https://developers.google.com/analytics/devguides/config/mgmt/v3/quickstart/web-php

https://developers.google.com/identity/protocols/OAuth2WebServer

此外,当使用以下方法时:

$client->setAccessToken($token)

$token需要是谷歌在发出授权请求时返回的完整对象,而不是你在对象内部获得的唯一对象access_token,所以如果你得到对象让我们说:

{"access_token":"xyz","token_type":"Bearer","expires_in":3600,"refresh_token":"mno","created":1532363626}

那么你需要给:

$client->setAccessToken('{"access_token":"xyz","token_type":"Bearer","expires_in":3600,"refresh_token":"mno","created":1532363626}')

不是

$client->setAccessToken('xyz')

然后即使你的过期了,谷歌也会通过使用对象中的access_token来刷新它。refresh_tokenaccess_token

于 2018-07-24T12:11:33.947 回答
2

发布 /oauth2/v4/token

主机:www.googleapis.com

标头

内容长度:163

内容类型:应用程序/x-www-form-urlencoded

请求体

client_secret=************&grant_type=refresh_token&refresh_token=sasasdsa1312dsfsdf&client_id=************

于 2018-06-28T20:03:48.100 回答
1

使用 ASP.Net Post 调用,这对我有用。

StringBuilder getNewToken = new StringBuilder();
getNewToken.Append("https://www.googleapis.com/oauth2/v4/token");                        
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(getNewToken.ToString());
                    var values = new Dictionary<string, string>
                    {
                        { "client_id", <Your Client Id> },
                        { "client_secret", <Your Client Secret> },
                        { "refresh_token", <Your Saved Refresh Token> },
                        { "grant_type", "refresh_token"}
                    };

                    var content = new FormUrlEncodedContent(values);
                    var response = await client.PostAsync(getNewToken.ToString(), content);
于 2019-07-15T11:58:13.560 回答
1

使用邮政电话,为我工作。

RestClient restClient = new RestClient();
RestRequest request = new RestRequest();

request.AddQueryParameter("client_id", "value");
request.AddQueryParameter("client_secret", "value");
request.AddQueryParameter("grant_type", "refresh_token");
request.AddQueryParameter("refresh_token", "value");

restClient.BaseUrl = new System.Uri("https://oauth2.googleapis.com/token");
restClient.Post(request);

https://youtu.be/aHs3edo0-mU

于 2021-02-01T17:59:59.743 回答