如何通过google drive API使用刷新令牌生成访问令牌?

时间:2012-05-17 06:42:37

标签: authorization google-drive-api

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

接下来我应该使用通过google drive API存储的刷新令牌生成访问令牌?

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

9 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:21)

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

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

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

希望能帮到任何人: - )

答案 2 :(得分:20)

如果您使用的是网络API,那么您应该对以下请求正文的网址POST进行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: 'ya....', token_type: 'Bearer', expires_in: 3599 }

答案 3 :(得分:3)

您需要做的只是一个发帖请求,如下所示:-

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

答案 4 :(得分:2)

如果您使用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();

答案 5 :(得分:1)

POST / oauth2 / v4 /令牌

主机:www.googleapis.com

标题

内容长度:163

内容类型:application / x-www-form-urlencoded

RequestBody

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

答案 6 :(得分:1)

只要发布我的答案以防万一,因为我花了一个小时才弄清楚它:)

首先是与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必须是Google发出授权请求时返回的完整对象,而不是您在对象内部获得的唯一access_token,因此,如果您得到该对象,请说:

{“ access_token”:“ xyz”,“ token_type”:“载体”,“ expires_in”:3600,“ refresh_token”:“ mno”,“创建”:1532363626}

然后您需要提供:

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

不是

$client->setAccessToken('xyz')

然后,即使您的access_token过期了,Google也会通过使用refresh_token对象中的access_token来刷新自身。

答案 7 :(得分:1)

使用 Post call,对我有用。

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

答案 8 :(得分:0)

使用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);