【发布时间】:2012-05-24 18:05:22
【问题描述】:
我已完成授权步骤并获得访问令牌和刷新令牌。
接下来我应该怎么做才能使用我通过 google drive API 存储的刷新令牌生成访问令牌?
由于我在 Force.com 上工作,因此我将无法使用任何 sdk,因此请建议直接通过 API 实现它的方法。
【问题讨论】:
标签: authorization google-drive-api
我已完成授权步骤并获得访问令牌和刷新令牌。
接下来我应该怎么做才能使用我通过 google drive API 存储的刷新令牌生成访问令牌?
由于我在 Force.com 上工作,因此我将无法使用任何 sdk,因此请建议直接通过 API 实现它的方法。
【问题讨论】:
标签: authorization google-drive-api
如果您想自己实现,Web 服务器应用程序的 OAuth 2.0 流程记录在 https://developers.google.com/accounts/docs/OAuth2WebServer,特别是您应该查看有关使用刷新令牌的部分:
https://developers.google.com/accounts/docs/OAuth2WebServer#refresh
【讨论】:
这是一个老问题,但在我看来还没有完全回答,我也需要这些信息,所以我会发布我的答案。
如果您想使用 Google Api 客户端库,那么您只需要一个包含刷新令牌的访问令牌,然后 - 即使访问令牌将在一小时后过期 - 库也会刷新自动为你代币。
为了获得带有刷新令牌的访问令牌,您只需要询问离线访问类型(例如在 PHP 中:$client->setAccessType("offline");),您就会得到它。请记住,只有在第一次授权时才能获得带有刷新令牌的访问令牌,因此请务必在第一时间保存该访问令牌,以便随时使用。
希望对任何人都有帮助:-)
【讨论】:
the access token with the refresh token only in the first authorization
如果您使用的是 web api,那么您应该使用以下请求正文对 URL 进行 http POST 调用: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"
}
【讨论】:
POST /oauth2/v4/token
主机:www.googleapis.com
标题
内容长度:163
内容类型:application/x-www-form-urlencoded
请求正文
client_secret=************&grant_type=refresh_token&refresh_token=sasasdsa1312dsfsdf&client_id=************
【讨论】:
只是发布我的答案以防万一我花了一个小时弄清楚它对任何人有帮助:)
首先,两个非常有用的链接与 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":"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 已过期,谷歌也会使用access_token 对象中的refresh_token 自行刷新。
【讨论】:
如果您使用 Java,请按照以下代码 sn-p :
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();
【讨论】:
使用 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);
【讨论】:
您需要做的只是一个如下的发布请求:-
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"
}
【讨论】:
使用邮政电话,为我工作。
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);
【讨论】: