Продолжайте получать 403 Forbidden из Google API (используя клиентскую библиотеку PHP v1)

Хорошо … Я должен сказать, что у меня недостаточно опыта использования API Google, поэтому я постараюсь объяснить как можно подробнее.

Мне нужно использовать PHP для получения данных из облачного хранилища, поэтому я попробовал свои учетные данные с помощью gsUtil, чтобы получить данные из корзины, и это работает; Но когда я пытаюсь использовать библиотеку PHP для получения данных, API ответил мне следующим содержанием:

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

Так как он не сказал мне, какой именно шаг является неправильным, я обыскал этот сайт и попробовал все, что выглядело одинаково, но ситуация остается.

Вот Конфигурация на моем Google Dev. Приставка:

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.

В 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
}
}

Пожалуйста, скажите мне, если я что-то пропустил.

2

Решение

Хорошо, у меня проблема: она должна выдавать себя за учетную запись пользователя, которая имеет право доступа к области API, о которой я упоминал в программе.

Поэтому некоторые дополнительные коды должны быть добавлены следующим образом:

$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, еще одна проблема решена! время двигаться вверх для следующей проблемы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]