我已经完成了授权步骤并获得了访问令牌和刷新令牌。
接下来我应该使用通过google drive API存储的刷新令牌生成访问令牌?
因为我在Force.com上工作,所以无法使用任何sdk所以请建议直接通过API实现它的方法。
答案 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);
答案 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);