承認の手順を完了し、アクセストークンと更新トークンを取得しました。
GoogleドライブAPIで保存した更新トークンを使用してアクセストークンを生成するには、次に何をすればよいですか?
Force.comで作業しているため、sdkを使用することはできませんので、APIを使用して直接実装する方法を提案してください。
自分で実装したい場合は、WebサーバーアプリケーションのOAuth 2.0フローが https://developers.google.com/accounts/docs/OAuth2WebServer に文書化されています、特に、更新トークンの使用に関するセクションを確認する必要があります。
https://developers.google.com/accounts/docs/OAuth2WebServer#refresh
Web APIを使用している場合は、http POST
をURLに呼び出す必要があります: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 }
これは古い質問ですが、完全には答えられていないようです。この情報も必要なので、答えを投稿します。
Google Api Client Libraryを使用する場合は、更新トークンを含むアクセストークンが必要です。1時間後にアクセストークンの有効期限が切れても、ライブラリはトークンを更新します自動的に。
更新トークンでアクセストークンを取得するには、オフラインアクセスタイプ(PHPの場合:$client->setAccessType("offline");
など)を要求するだけで取得できます。更新トークンを含むアクセストークンは最初の認証でのみ取得されるため、最初にそのアクセストークンを保存して、いつでも使用できるようにしてください。
それが誰にも役立つことを願っています:-)
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();
POST/oauth2/v4/token
ホスト:www.googleapis.com
ヘッダー
コンテンツの長さ:163
コンテンツタイプ:application/x-www-form-urlencoded
RequestBody
client_secret = ************&grant_type = refresh_token&refresh_token = sasasdsa1312dsfsdf&client_id = ************
私がそれを理解するのに1時間を費やしたので、それが誰にも役立つ場合に備えて、私の答えを投稿するだけです:)
まず、Google APIに関連する2つの非常に役立つリンクと、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
_だけでなく、承認リクエストを行うときにGoogleから返される完全なオブジェクトである必要があります。
{"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
_が期限切れになったとしても、Googleは_refresh_token
_オブジェクトで_access_token
_を使用してそれを更新します。
あなたがする必要があるのは以下のような投稿リクエストです:-
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"
}
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);