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

Nir*_*nja 52 authorization google-drive-api

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

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

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

Cla*_*ino 29

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

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


Ash*_*ngh 25

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

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

{ access_token: 'ya....', token_type: 'Bearer', expires_in: 3599 }
Run Code Online (Sandbox Code Playgroud)

  • 请尝试请求正文x-www-form-urlencoded. (4认同)
  • 务实地使用httpclient,在可能的情况下也不能从邮递员那里工作。 (2认同)
  • 您从哪里获取 client_secret 和刷新令牌? (2认同)

amo*_*mos 21

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

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

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

希望能帮到任何人:-)

  • 您实际上如何开始获取访问令牌? (2认同)

Raa*_*aie 7

您需要做的就是一个像下面这样的帖子请求:-

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"
}
Run Code Online (Sandbox Code Playgroud)


Lea*_*ner 6

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

首先,有两个非常有用的链接,与 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”:“承载”,“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来刷新它。refresh_tokenaccess_token


Div*_*iya 6

如果您使用 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();
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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);
Run Code Online (Sandbox Code Playgroud)

https://youtu.be/aHs3edo0-mU