2014-02-27 3 views
9

Ich habe seit Tagen gesucht und versuchen, neue und ältere Version von Google-API-Client zusammen mit verschiedenen anderen Beispielen da draußen, aber ich kann diesen Fehler nicht umgehen. Der folgende Code ist das Beispiel des Dienstkontos, das von GitHub abgerufen wurde, und ich habe meine Anmeldeinformationen und die Datei von der API-Konsole gelöscht. Ich habe eine andere Datei, die ich gerade erstelle, aber für diese Frage wäre diese einfachere Datei einfacher zu diskutieren. Ich bekomme den gleichen Fehler mit beiden Dateien.Getting "Nicht in der Lage, die P12-Datei zu analysieren ..." Fehler mit Google-API-Client

Ich bin völlig ratlos darüber, warum es diesen Fehler wirft.

Ich habe verifiziert "file_get_contents" erhält tatsächlich den Inhalt der Datei und mein "notasecret" Passwort wird richtig gezogen. Ich habe gehofft this recent commit könnte helfen, aber leider hat es diesen Fehler für mich nicht gelöst.

Irgendeine Idee, was hier falsch läuft? Danke für Anregungen!

<?php 

session_start(); 
include_once "templates/base.php"; 

set_include_path("../src/" . PATH_SEPARATOR . get_include_path()); 
require_once 'Google/Client.php'; 
require_once 'Google/Service/Books.php'; 


$client_id = 'xxxx.apps.googleusercontent.com'; 
$service_account_name = '[email protected]'; 
$key_file_location = 'xxxx-privatekey.p12'; 

echo pageHeader("Service Account Access"); 
if ($client_id == 'xxxx.apps.googleusercontent.com' 
    || !strlen($service_account_name) 
    || !strlen($key_file_location)) { 
    echo missingServiceAccountDetailsWarning(); 
} 

$client = new Google_Client(); 
$client->setApplicationName("Client_Library_Examples"); 
$service = new Google_Service_Books($client); 

if (isset($_SESSION['service_token'])) { 
    $client->setAccessToken($_SESSION['service_token']); 
} 
$key = file_get_contents($key_file_location); 
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name, 
    array('https://www.googleapis.com/auth/books'), 
    $key 
); 
$client->setAssertionCredentials($cred); 
if($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion($cred); 
} 
$_SESSION['service_token'] = $client->getAccessToken(); 


$optParams = array('filter' => 'free-ebooks'); 
$results = $service->volumes->listVolumes('Henry David Thoreau', $optParams); 
echo "<h3>Results Of Call:</h3>"; 
foreach ($results as $item) { 
    echo $item['volumeInfo']['title'], "<br /> \n"; 
} 

echo pageFooter(__FILE__); 
+0

Und wo ist die p12-Datei? Ist das nicht der wichtige Teil? –

+1

Dies ist die p12-Datei, die Google beim Erstellen einer Dienstkonto-Client-ID bereitstellt. Es ist möglich, nehme ich an, dass etwas mit der Datei nicht stimmt, aber das scheint ein weit verbreitetes Problem zu sein, wenn Google schlechte p12-Dateien erzeugt. – theonlynewts

Antwort

1

Verstanden! This commit habe mich gedacht, dass vielleicht openssl unsere Datei auch nicht mochte. Ich konvertierte meine Datei von einem p12 zu einem pem unter Verwendung these instructions. Dann habe ich die Datei bearbeitet, um etwas Text vor dem "----- BEGIN RSA PRIVATE KEY -----" zu entfernen, damit der Code vom neuen Commit es richtig erkennt. Hat diese Datei gelöscht und Ergebnisse wie Magie erhalten.

Das war es! Ich bin mir immer noch nicht sicher, was dazu führen würde, dass die automatisch generierte p12-Datei nicht kooperiert, also lassen Sie mich wissen, ob jemand Ideen hat.

+1

Google bietet nun auf der Anmeldeinformationsseite die Option "Neuen P12-Schlüssel generieren" an, sodass keine Konvertierung erforderlich ist. – user2768

0

Ich bin mir ziemlich sicher, dass Sie die Phrase 'notasecret' irgendwo in diesem Abschnitt von Code schreiben müssen: 'Wo'

$key = file_get_contents($key_file_location); 
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name, 
    array('https://www.googleapis.com/auth/books'), 
    $key 
); 

, ist die Frage ...

Das sieht aus wie es den richtigen Code: https://github.com/google/google-api-php-client/blob/master/src/Google/Auth/AssertionCredentials.php

ich meine Antwort aktualisieren werde das funktioniert, um zu bestätigen, sobald ich es getestet haben.

:)

+0

Mit der PHP-API von Google (https://github.com/google/google-api-php-client) musste ich nirgendwo "notasecret" angeben. Die Lösung für mich war sicherzustellen, dass der Webserver die Datei lesen konnte. – rinogo

3

Ich erlitt diesen Fehler auch, in meinem Fall war das Problem, dass die .p12-Datei Leseberechtigung nur für den Besitzer und keinen Zugriff für Gruppe und andere hatte. Ich verbrachte 2 Tage meines Lebens für diese ...

Jetzt bekomme ich den Fehler "Benutzer hat keine ausreichenden Berechtigungen für dieses Profil", aber zumindest ist etwas Neues !!

+0

Das war das Problem für mich auch ... Dank dir musste ich nur 10min mit dieser Ausgabe verbringen :) –

2

Ich stolperte gerade in das gleiche Problem. Das Konvertieren der p12-Datei in .pem (wie es nur von denNews vorgeschlagen wurde) funktionierte nicht für mich. Es gab keine "--- RSA PRIVATE KEY BEGIN ---" Abschnitt in der .pem-Datei

Aber seltsam genug, während das nicht funktioniert (Original-Code von Googles P12.php):

if (!openssl_pkcs12_read($p12, $certs, $password)) { ... 

Das funktioniert:

$pkcs12 = file_get_contents($p12); 
if (!openssl_pkcs12_read($pkcs12, $certs, $password)) { ... 

(getestet auf PHP 5.5.9 auf Kubuntu 14.04)

+0

Arbeitete für mich auf CentOS 6 und PHP 5.3 +1 – Heisnberg

+0

Gearbeitet! Ich habe den Kassenprüfer benutzt. Es ist jedoch nicht notwendig, die P12.php-Datei zu ändern. Sie können die API bereits mit dem Inhalt anstelle des Pfades aufrufen. – Salim

0

Es ist normalerweise nur ein Dateiberechtigungs-Problem. Stellen Sie sicher, dass der Benutzer, der Apache ausführt, über Berechtigungen zum Lesen der p12-Datei verfügt.

0

Ich war auch gestolpert beim Parsen p12-Datei. Es zeigte immer Fehler wie "Undefinierte Funktion openssl_pkcs12_read()". Um diesen Fehler zu beheben, müssen Sie zunächst die Datei php.ini überprüfen. Öffnen Sie php.ini, dann suchen Sie nach openssl und entfernen Sie die Zeile. Speichern und starten Sie nun alle wamp Dienste neu.

Und Ihre Funktion funktioniert.

Verwandte Themen