web-dev-qa-db-fra.com

Comment se connecter à l'API Google Drive à l'aide de cURL?

En supposant qu'il y ait trois étapes, 

  1. Obtenir un code d'appareil, 
  2. Obtenir un jeton d'authentification, 
  3. Connectez-vous à Google Drive.

ÉTAPE 1: Je franchis l'étape 1 si (et seulement si) j'ignore le paramètre redirect_url indiqué nécessaire sur divers liens de procédure. Alors c'est...

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'

À ce stade, le retour est ... {"device_code": "[device_code]", "user_code": "[user_code]", "expires_in": 1800, "interval": 5, "verification_url": "https://www.google.com/device"}

Jusqu'ici tout va bien.

ÉTAPE 2: C’est là que je reste coincé. Essayé diverses itérations de ce qui suit:

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'

Les retours ci-dessus

{"error" : "invalid_grant", "error_description" : "Malformed auth code."}

Si grant_type est remplacé par 'http://oauth.net/grant_type/device/1.0', la réponse est

{"error" : "invalid_request", "error_description" : "Parameter not allowed for this message type: redirect_uri"}

Si redirect_uri est supprimé, la réponse est

{"error" : "authorization_pending"}

Les tentatives cURL ci-dessus ont été regroupées en faisant référence aux liens suivants ... https://developers.google.com/identity/protocols/OAuth2ForDevices

http://www.visualab.org/index.php/using-google-rest-api-for-analytics#comment-157284

liste les fichiers de Google Drive avec curl

Google Drive ne répertorie pas les fichiers dans le dossier

Impossible d'extraire le jeton d'accès à Google OAuth 2.0

https://www.daimto.com/google-authentication-with-curl/

Stymied!

** MODIFIER ** Sur demande, l’objectif ici est de développer une méthode d’alerte lors du téléchargement des fichiers et de mettre en place un système capable de télécharger de manière sélective et systématique en fonction de diverses requêtes.

La raison pour laquelle nous ne faisons pas cela avec l'interface Web de Google Drive: la taille des fichiers est assez grande: 10 à 50 Go par fichier, et Google ne peut pas télécharger par lots sans compresser au préalable, et ne peut rien compresser au-delà d'une taille inférieure à notre plus petit fichier. 

La raison pour laquelle nous ne le faisons pas avec l'APP de Google Drive: Il n'est pas possible (AFAIK) de gérer les fichiers à télécharger en local ou à ne pas télécharger localement, et il n'existe aucune possibilité (encore une fois AFAIK) de stocker sur un volume externe.

Nous intégrons également une base de données de flux de travail dans nos téléchargements de contenu multimédia: suivi, dates, notes de progression, versions, etc., dont aucun ne fait partie d'un système Google existant. L'objectif ici est donc de voir quelles options l'API de Google pourrait contenir pour tout cela.

5
WhatsYourFunction

première étape obtenir le code

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

Mettez ceci dans une fenêtre de navigateur. Et copiez le code à la deuxième étape. Je soupçonne que le problème vient du code que vous recevez de la première étape

deuxième étape code d'échange

Il y avait un lien vers Gist pour le code utilisé dans mon blog que vous avez lié. 

Comme vous pouvez le constater, les données de publication doivent être envoyées sous la forme d’une longue chaîne de requête séparée par &

--data 'client_id = [ID client d'application] & client_secret = [Secret du client d'application] & refresh_token = [Jeton d'actualisation accordé par la deuxième étape] & grant_type = refresh_token' \

Code extrait de 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 avec out (')' s

Cela semble bien fonctionner. J'ai supprimé l'en-tête qui n'est pas nécessaire et tous les (') que vous aviez dans votre code. Je n'ai rencontré aucun problème pour obtenir un jeton d'actualisation renvoyé.

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

réponse: 

{
  "access_token" : "pO4LBSreV_r2i8kPklXVTqylXbMXip4OmQ0ZgRW0qZ8_b1ZP_zPJv0Xc_Qqsj9nM5ryWb7C81dYNFkO_bC6ifWA68dIlz40a0owG4GWpbZ2ufkHNXgre4",
  "expires_in" : 3600,
  "refresh_token" : "1/mEADfx6ffWULNBNFrKnlqOlK1uGL8Z546qBCHg",
  "token_type" : "Bearer"
}
4
DaImTo

RÉPONSE:

Une réponse partielle à la question - "partielle" car elle n'utilise pas de pur CURL - mais il était possible de le faire fonctionner en utilisant PHP pour préparer certaines des valeurs dynamiques et SSL, puis exécuter cURL de l'intérieur PHP.

La référence clé pour les éléments suivants provient de la documentation de Google ici: 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
}
0
WhatsYourFunction