2016-03-22 1 views
2

Okay ... Ich muss sagen, ich habe nicht genug Erfahrung mit Google-API, so werde ich versuchen, so detailliert wie möglich zu erklären.Keeping 403 Verboten von Google API (mit PHP-Client-Bibliothek v1)

Ich muss PHP verwenden, um die Daten des Cloud-Speichers zu erfassen, also habe ich meine Anmeldeinformationen mit gsUtil versucht, Daten aus dem Bucket zu erfassen, und es funktioniert; Aber wenn ich versuche, PHP-Bibliothek zu verwenden, um Daten zu packen, die API antwortete mich mit diesem Inhalt:

"error": { 
    "errors": [ 
    { 
     "domain": "global", 
     "reason": "forbidden", 
     "message": "Forbidden" 
    } 
    ], 
    "code": 403, 
    "message": "Forbidden" 
} 

Da es nicht genau sagen, hat mir den Schritt falsch ist, so dass ich um diese Seite gesucht und versuchte, alles, was sah ähnlich aus, aber die Situation steht.

Hier ist die Konfiguration auf meinem Google Dev. Konsole:

Api Manager > Overall > Enabled API: 

(a)Drive API. 

(b)Cloud Storage. 

(c)Cloud Storage JSON API. 

Api Manager > Credentials: 

(a)Api Key/OAuth 2.0 ID/Service Acc. Key are created. 

(b)Server IPs are added to the Api key's accept IP list. 

(c)Service Account have the Editor permission to the Project, service acc key is bind to this account too. 

In PHP:

$email = '<my gmail>'; 
$scope = 'https://www.googleapis.com/auth/cloud-platform'; 
$apiKey = '<my api key>'; 
$oAuthId = '<OAuth ID>'; 
$serviceAcc = '<service account id>@developer.gserviceaccount.com'; 
$keyFileLocation = $_SERVER['DOCUMENT_ROOT']. "/<p12 file>"; 
$bucketId = '<my bucket id>'; 
$list = array(); 

$client = new Google_Client(); 
$client->setApplicationName("gp-api"); 
$client->setDeveloperKey($apiKey); 
$cred = new Google_Auth_AssertionCredentials (
      $serviceAcc, 
      array($scope), 
      file_get_contents($keyFileLocation) 
    ); 

$client->setAssertionCredentials($cred); 

if($client->getAuth()->isAccessTokenExpired()) 
    $client->getAuth()->refreshTokenWithAssertion($cred); 

if($client->getAccessToken()) { 
    $reqUrl = "https://www.googleapis.com/storage/v1/b/$bucketId/o/"; 
    $request = new Google_Http_Request($reqUrl, 'GET', null, null); 
    $httpRequest = $client->getAuth()->authenticatedRequest($request); 
    if ($httpRequest->getResponseHttpCode() == 200) { 
    $objects = json_decode($httpRequest->getResponseBody()); 
    foreach ($objects->items as $object) { 
     $list[] = $object->mediaLink; 
    } 
    } 
    else { 
    echo $httpRequest->getResponseHttpCode(); // This is where I got the 403 
    } 
} 

Bitte mir sagen, ob ich etwas verpasst.

+0

Ist es möglich, dass Sie keine Leseberechtigung für den Bucket haben? Alternativ sehe ich, dass Sie sowohl $ email und $ serviceAcc definieren, aber Sie verwenden eine undefinierte Variable, $ accountName, wenn Sie die Google_Auth_AssertionCredentials erstellen. Füllen Sie das mit einem anderen Code aus? –

+0

@Brandon Yarbrough oops, du hast meinen Tippfehler. xD Es ist jetzt behoben. – Kaninchen

+0

@Brandon Yarbrough aber wenn ich nicht die Leseberechtigung habe, hätte ich den Fehler bekommen, während ich gsUtil verwendet habe, um meinen Eimer zu lesen. Aber meine gsUtils mit diesen Anmeldeinformationen funktioniert gut ohne Probleme. – Kaninchen

Antwort

0

Ok, ich habe das Problem: es muss die Identität des Benutzerkontos annehmen, die die Berechtigung haben, auf den API-Bereich zuzugreifen, den ich im Programm erwähnte.

So einige zusätzliche Codes müssen wie folgt ergänzt werden:

$email = '<email account which could access that api>'; 
$scope = 'https://www.googleapis.com/auth/cloud-platform'; 
$apiKey = '<my api key>'; 
$oAuthId = '<OAuth ID>'; 
$serviceAcc = '<service account id>@developer.gserviceaccount.com'; 
$keyFileLocation = $_SERVER['DOCUMENT_ROOT']. "/<p12 file>"; 
$bucketId = '<my bucket id>'; 
$list = array(); 

$client = new Google_Client(); 
$client->setApplicationName("gp-api"); 
$client->setDeveloperKey($apiKey); 
$cred = new Google_Auth_AssertionCredentials (
     $serviceAcc, 
     array($scope), 
     file_get_contents($keyFileLocation), 
     'notasecret', 
     'http://oauth.net/grant_type/jwt/1.0/bearer', 
     $email 
); 

Woooooyaaaaa, ein weiteres Problem gelöst! Zeit für das nächste Problem.

Verwandte Themen