web-dev-qa-db-ja.com

cURLを使用してGoogle Drive APIに接続するにはどうすればよいですか?

3つのステップがあるとすると、

  1. デバイスコードの取得
  2. 認証トークンを取得する、
  3. Googleドライブに接続します。

ステップ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

curlでgoogleドライブファイルをリスト

Googleドライブがフォルダ内のファイルを一覧表示しない

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が保持できるオプションを確認することです。

8

ステップ1コードを取得

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にコピーします。問題はあなたが最初のステップから返されているコードにあると思う

ステップ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

-d( ')なし

これは正常に動作するようです。不要なヘッダーを削除しましたが、コードに含まれていたすべての( ')は更新トークンが返されるので問題はありませんでした

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"
}
5
DaImTo

回答:

質問への部分的な回答-純粋な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
}
1