Подтвердить что ты не робот

Как использовать ключ JSON вместо P12 в проверке подлинности листа Google с помощью PHP?

Я работаю с Google Spread Sheet в PHP, когда я использую ключ P12, он отлично работает, но когда я использую ключ JSON вместо ключа P12 при аутентификации с помощью Google Spread Sheet, он дает

Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Unable to load private key'

Скажите, пожалуйста, как использовать ключ JSON во время проверки подлинности с помощью Google Spread Sheet в PHP

Пожалуйста, помогите мне разобраться с этой проблемой.

4b9b3361

Ответ 1

ok вот решение, которое я нашел.

Для ключа P12
Обычно для генерации токена используется следующий код.

public static function getToken()
    {
        $key = file_get_contents( APPLICATION_DIR.'/'.APPLICATION_GOOGLE_CLIENT_KEY_FILE);

        $cred = new Google_Auth_AssertionCredentials(
            APPLICATION_GOOGLE_CLIENT_EMAIL,
            array('https://spreadsheets.google.com/feeds'),
            $key
        );

        $client = new Google_Client();
        $client->setAssertionCredentials($cred);

        if (!$client->getAuth()->isAccessTokenExpired()) {
            return false;
        }
        else {
            $client->getAuth()->refreshTokenWithAssertion($cred);
        }

        $service_token = json_decode($client->getAccessToken());


        return $service_token->access_token;
    }

Для ключа JSON
но теперь у нас нет ключа P12, у нас есть ключ JSON, поэтому я только что внес некоторые изменения в код выше, пожалуйста, посмотрите ниже:

public static function getToken()
    {

        $key = APPLICATION_DIR.'/'.APPLICATION_GOOGLE_CLIENT_KEY_FILE;
        $data = json_decode(file_get_contents($key));    // here i decoded the json

         if (isset($data->type) && $data->type == 'service_account') {

            $cred = new Google_Auth_AssertionCredentials(
                APPLICATION_GOOGLE_CLIENT_EMAIL,    // it the client email
                array('https://spreadsheets.google.com/feeds'),   // it google spreadsheet scope
                $data->private_key         // here is the private key
            );
         }

        $client = new Google_Client();
        $client->setAssertionCredentials($cred);

        if (!$client->getAuth()->isAccessTokenExpired()) {
            return false;
        }
        else {
            $client->getAuth()->refreshTokenWithAssertion($cred);
        }

        $service_token = json_decode($client->getAccessToken());


        return $service_token->access_token;
    }

Что это....:):)

Ответ 2

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

$token = json_decode($client->getAccessToken());
$serviceRequest = new DefaultServiceRequest($token->access_token);
ServiceRequestFactory::setInstance($serviceRequest);

Использование клавиши p12 должно работать нормально.

session_start();

define('GOOGLE_CLIENT_ID','');
define('GOOGLE_CLIENT_EMAIL','');
define('GOOGLE_SPREADSHEETS_SCOPE','https://spreadsheets.google.com/feeds');
define('GOOGLE_APPLICATION_NAME','whatever');
define('GOOGLE_KEY_FILE','xxxxxxxxxxxxxx.p12'); // pass for key: notasecret

function getToken()
{
    $client = new Google_Client();
    $client->setApplicationName(GOOGLE_APPLICATION_NAME);
    $client->setClientId(GOOGLE_CLIENT_ID);

    $key = file_get_contents(GOOGLE_KEY_FILE);
    $cred = new Google_Auth_AssertionCredentials(
        GOOGLE_CLIENT_EMAIL,
        array(GOOGLE_SPREADSHEETS_SCOPE),
        $key
    );

    $client->setAssertionCredentials($cred);

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

    $service_token = json_decode($client->getAccessToken());
    return $service_token->access_token;
}

require("vendor/autoload.php");

use Google\Spreadsheet\DefaultServiceRequest;
use Google\Spreadsheet\ServiceRequestFactory;

$_SESSION['access_token']=getToken();

$serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($_SESSION['access_token']);
Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest);
$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
$spreadsheetFeed = $spreadsheetService->getSpreadsheets();