2015-01-18 8 views
6

Sembra che l'ultima versione del google-api-php-client per PHP non è allineata con i documenti @https://developers.google.com/drive/web/examples/phpgoogle-api-php-client: client non valido di file JSON segreto

Guardando lo src codice Sto vedendo che sta cercando le chiavi nel JSON scaricato che il metodo setAuthConfigFile() non riesce a trovare: client_secret, installato, web, redirect_uris (altri?) non sono presenti nel JSON scaricato. Sono presenti solo private_key_id, private_key, client_email, client_id e type.

Il codice e i documenti sembrano davvero disorganizzati e fuori sincrono ... non sarebbero i primi per Google. Qualcuno ha mai fatto funzionare OAuth di recente usando quella libreria?

+1

Eventuali aggiornamenti su questo? Avere lo stesso problema qui. –

+0

@NebezBriefkani Ho avuto lo stesso problema. Nel mio caso, il file 'client_secret.json' era impostato di default con' read only' su mac. Ho fatto 'chmod 777' (_gave write permissions_) a questo file, che ha risolto il problema. –

risposta

7

C'è una differenza tra un "account di servizio" e un "apllication web" per effettuare chiamate alle API. Quando è stato creato un "account di servizio" si otterrà il file di cui sopra, un file JSON con private_key, client_email, client_id ecc

Quando si crea un'applicazione web vi verrà dato un client_id, client_secret, redirect_uri ecc

vorrei suggerire la lettura di queste pagine per scegliere quale tasto ed effettuare il login è necessario (su entrambe le pagine a trovare esempi di integrarlo in PHP):

è possibile utilizzare le API libreria client di Google per PHP per creare web server applicazioni che utilizzano l'autorizzazione OAuth 2.0 per accedere alle API di Google . OAuth 2.0 consente agli utenti di condividere dati specifici con un'applicazione mantenendo i propri nomi utente, password e altre informazioni private. Ad esempio, un'applicazione Web può utilizzare OAuth 2.0 per ottenere l'autorizzazione da parte degli utenti di archiviare i file nelle loro unità Google.

https://developers.google.com/api-client-library/php/auth/web-app

Tipicamente, un'applicazione utilizza un account di servizio quando l'applicazione utilizza le API di Google per lavorare con i propri dati, piuttosto che i dati di un utente. Ad esempio, un'applicazione che utilizza Google Cloud Datastore per la persistenza dei dati utilizza un account di servizio per autenticare le sue chiamate a l'API di Google Cloud Datastore.

https://developers.google.com/api-client-library/php/auth/service-accounts

0

Comprendo il rischio, hai un problema con Google API. Nella console dell'API di Google ci sono 3 tipi di file json, uno è Web, il secondo è Servizio e l'ultimo è installato. la scelta che molti hanno bisogno di usare è quella Installata perché Otterrete Chiave, Installata o altro ..

2

C'è una nuova funzione nella libreria php che si avvicina a questo, ma non consente l'impostazione di sub, quindi dà sempre l'autorizzazione fallisce. Quindi, per prima cosa aggiorna la funzione di libreria php in src/Google/Client.php per questo:

public function loadServiceAccountJson($jsonLocation, $scopes) 
    { 
    $data = json_decode(file_get_contents($jsonLocation)); 
    if (isset($data->type) && $data->type == 'service_account') { 
     // Service Account format. 
     $cred = new Google_Auth_AssertionCredentials(
      $data->client_email, 
      $scopes, 
      $data->private_key, 
      'notasecret', 
      'http://oauth.net/grant_type/jwt/1.0/bearer', 
      $data->sub 
    ); 
     return $cred; 
    } else { 
     throw new Google_Exception("Invalid service account JSON file."); 
    } 
    } 

Poi, aggiungere un sub valore ai dati nel file auth JSON server:

{ 
    "private_key_id": "removed", 
    "private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n", 
    "client_email": "removed", 
    "client_id": "removed", 
    "redirect_uris":[your urls here], 
    "type": "service_account", 
    "sub": "[email protected]" 
} 

Ora, ottenere l'autorizzazione:

$credentials = $client->loadServiceAccountJson('serverauth.json',"https://www.googleapis.com/auth/admin.directory.user.readonly"); 
$client->setAssertionCredentials($credentials); 
if ($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); 
} 

Dove serverauth.json è il file di chiavi JSON scaricato dall'account di servizio che si desidera utilizzare e ha aggiunto la sottorubrica a.

E, infine, creare un'istanza Directory e interrogarlo:

$service = new Google_Service_Directory($client); 
$optParams = array(
     'domain' => 'google.domain.com', 
     'orderBy' => 'email', 
     'viewType' => 'domain_public', 
     'query' => "givenName:'Joe' familyName:'Schmoe Jr'" 
); 
$results = $service->users->listUsers($optParams); 
$users = $results->getUsers(); 

print_r($users); 
0

1) "CREDENTIALS_PATH" dovrebbe puntare a un file inesistente (in un percorso scrivibile)

2) "CLIENT_SECRET_PATH" dovrebbe puntare al file delle credenziali "ID client OAuth 2.0", creato e scaricato da Google Console nella sezione Credenziali Api.

Per uno script php lato server, come il tuo, prestare attenzione durante la creazione del record "ID client OAuth 2.0": nella procedura guidata di creazione, selezionare "altro" tipo di applicazione e non il tipo "Web".

Saluti

+0

Sono sicuro che lo troverò io stesso trascorrendo anni alla ricerca di questo, ma dove sarebbe? –

Problemi correlati