3つのステップがあるとすると、
ステップ1:さまざまなハウツーリンクに必要なredirect_url
パラメータのリストを無視した場合にのみ、ステップ1を実行します。っていうことは...
curl -d 'client_id=*client_id*' -d 'scope=https://www.googleapis.com/auth/drive.file' -d 'response_type=code' 'https://accounts.google.com/o/oauth2/device/code'
その時点での戻り値は... {"device_code": "[device_code]", "user_code": "[user_code]", "expires_in": 1800, "interval": 5, "verification_url": "https://www.google.com/device"}
ここまでは順調ですね。
ステップ2:ここで私は行き詰まります。次のさまざまなイテレーションを試しました:
curl -H 'Content-Type: application/x-www-form-urlencoded' -d 'client_id=**client_id**' -d 'client_secret=*client_secret*' -d 'grant_type=authorization_code' -d 'redirect_uri=urn:ietf:wg:oauth:2.0:oob' -d 'code=[device_code_from_above]' 'https://accounts.google.com/o/oauth2/token'
上記のリターン
{"error" : "invalid_grant", "error_description" : "Malformed auth code."}
grant_type
を'http://oauth.net/grant_type/device/1.0'
に変更すると、応答は
{"error" : "invalid_request", "error_description" : "Parameter not allowed for this message type: redirect_uri"}
redirect_uri
が削除された場合、応答は
{"error" : "authorization_pending"}
上記のcURLの試みは、次のリンクを参照してまとめられました... https://developers.google.com/identity/protocols/OAuth2ForDevices
http://www.visualab.org/index.php/using-google-rest-api-for-analytics#comment-157284
Googleを取得できませんOAuth 2.0アクセストークン
https://www.daimto.com/google-authentication-with-curl/
スティミード!
**編集**リクエストごとの目標は次のとおりです。ファイルのアップロード時にアラートを受け取る方法を開発し、さまざまなクエリに基づいて選択的かつ体系的にダウンロードできるシステムを導入します。
GoogleドライブのウェブUIでこれを行わない理由:ファイルサイズはかなり大きく、ファイルごとに10〜50 GBです。Googleは、最初に圧縮しないとバッチダウンロードできず、それよりも小さいサイズでは何も圧縮できません。最小のファイル。
GoogleドライブのAPPでこれを行わない理由:ローカルでダウンロードするファイルとダウンロードしないファイルを管理(AFAIK)することはできません。また、外部ボリュームに保存する機能(これもAFAIK)はありません。
また、ワークフローデータベースをメディアのアップロードとダウンロードに統合しています。追跡、日付、進行状況のメモ、バージョンなど、既存のGoogleシステムの一部ではありません。したがって、ここでの目標は、これらすべてに対してGoogleのAPIが保持できるオプションを確認することです。
https://accounts.google.com/o/oauth2/auth?client_id=[Application Client Id]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=[Scopes]&response_type=code
これをブラウザウィンドウに入れます。そして、コードをステップ2にコピーします。問題はあなたが最初のステップから返されているコードにあると思う
あなたがリンクした私のブログ投稿で使用されているコードの要旨へのリンクがありました。
ご覧のとおり、投稿データは&で区切られた1つの長いクエリ文字列として送信する必要があります
--data 'client_id = [アプリケーションクライアントID]&client_secret = [アプリケーションクライアントシークレット]&refresh_token = [2番目のステップで付与された更新トークン]&grant_type = refresh_token' \
googleauthenticationcurl.sh からリッピングされたコード
# Client id from Google Developer console
# Client Secret from Google Developer console
# Scope this is a space seprated list of the scopes of access you are requesting.
# Authorization link. Place this in a browser and copy the code that is returned after you accept the scopes.
https://accounts.google.com/o/oauth2/auth?client_id=[Application Client Id]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=[Scopes]&response_type=code
# Exchange Authorization code for an access token and a refresh token.
curl \
--request POST \
--data "code=[Authentcation code from authorization link]&client_id=[Application Client Id]&client_secret=[Application Client Secret]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code" \
https://accounts.google.com/o/oauth2/token
# Exchange a refresh token for a new access token.
curl \
--request POST \
--data 'client_id=[Application Client Id]&client_secret=[Application Client Secret]&refresh_token=[Refresh token granted by second step]&grant_type=refresh_token' \
https://accounts.google.com/o/oauth2/token
これは正常に動作するようです。不要なヘッダーを削除しましたが、コードに含まれていたすべての( ')は更新トークンが返されるので問題はありませんでした
curl -d client_id=103456123799103-vpdthl4ms0soutcrpe036ckqn7rfpn.apps.googleusercontent.com -d client_secret=uxpj6hx1H2N5BFqdnaNhIbie -d grant_type=authorization_code -d redirect_uri=urn:ietf:wg:oauth:2.0:oob -d code=4/AABvK4EPc__nckJBK9UGFIhhls_69SBAyidj8J_o3Zz5-VJN6nz54ew https://accounts.google.com/o/oauth2/token
応答:
{
"access_token" : "pO4LBSreV_r2i8kPklXVTqylXbMXip4OmQ0ZgRW0qZ8_b1ZP_zPJv0Xc_Qqsj9nM5ryWb7C81dYNFkO_bC6ifWA68dIlz40a0owG4GWpbZ2ufkHNXgre4",
"expires_in" : 3600,
"refresh_token" : "1/mEADfx6ffWULNBNFrKnlqOlK1uGL8Z546qBCHg",
"token_type" : "Bearer"
}
回答:
質問への部分的な回答-純粋なcURLを使用しないため 'partial'-PHPを使用して動的値とSSL値の一部を準備し、次に、PHP内からcURLを実行します。
以下の主要な参照は、Googleのドキュメントから取得されます: https://developers.google.com/identity/protocols/OAuth2ServiceAccount
echo GoogleTokenRequest();
function GoogleTokenRequest(){
$GoogleApiKeyInfo=GoogleApiKeyInfo();
$Header=array();
$Header["alg"]="RS256";
$Header["typ"]="JWT";
$ClaimSet=array();
$ClaimSet["iss"]=$GoogleApiKeyInfo["client_email"];
$ClaimSet["scope"]="https://www.googleapis.com/auth/drive";
$ClaimSet["aud"]="https://www.googleapis.com/oauth2/v4/token";
$ClaimSet["iat"]=time();
$ClaimSet["exp"]=$ClaimSet["iat"]+(60);
$Jws=base64_encode(json_encode($Header)).".".base64_encode(json_encode($ClaimSet));
$OpenSslRslts=openssl_sign($Jws,$Signature,$GoogleApiKeyInfo["private_key"],OPENSSL_ALGO_SHA256);//Ref: http://php.net/manual/en/function.openssl-sign.php
$Jwt=$Jws.".".base64_encode($Signature);
$SendVars=array();
$SendVars["grant_type"]=("urn:ietf:params:oauth:grant-type:jwt-bearer");
$SendVars["assertion"]=$Jwt;
$SendVars=http_build_query($SendVars);
$UrlDomain="www.googleapis.com";
$UrlPath="/oauth2/v4/token";
$UrlFull=$UrlDomain.$UrlPath;
$CurlType="Post";
$ThisHeader=[
strtoupper($CurlType)." ".$UrlPath,
"Host: ".$UrlDomain,
"Content-Type: application/x-www-form-urlencoded"
];
return Process_cURL("https://".$UrlFull,$CurlType,$ThisHeader,$SendVars);
}
function GoogleApiKeyInfo(){
//The following JSON data is downloaded from https://console.developers.google.com/apis/credentials when creating a project API key.
return json_decode('{
"type": "service_account",
"project_id": "XXX",
"private_key_id": "XXXX",
"private_key": "-----BEGIN PRIVATE KEY-----VeryLongMultiLineString-----END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "XXXXX",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[email protected]"
}');
}
function Process_cURL($ThisUrl,$ThisType,$ThisHeader,$ThisData){
//Handler for a variety of cURL calls. Returns JSON string
}