Получить токен API Google Analytics / Google_Client getAccessToken возвращает null / empty - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь получить токен доступа Google для учетной записи службы, чтобы получить доступ к Analytics API со стороны клиента.

На стороне сервера у меня есть следующий код:

    $keyFile = base_path() . '/keys/xxxxxxxx-xxxxxxxxx.json';
    $client = new Google_Client();
    $client->setApplicationName('Analytics Demo');
    $client->setAuthConfig($keyFile);
    $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']);

    $token = $client->getAccessToken();  // Returns null

В какой-то момент он вернул токен, но после пары вызовов он начал возвращать null.

Попытка получить $client->getRefreshToken() также возвращает null.

Когда я поместите $client в объект Google_Service_Analytics, кажется, все работает нормально, поэтому я знаю, что файл ключей правильный и правильно прочитан:

    $analytics = new Google_Service_Analytics($client);
    $accounts = $analytics->management_accounts->listManagementAccounts(); // Returns proper data

Есть идеи, что может пойти не так?

ОБНОВЛЕНИЕ:

Вызов $client->isAccessTokenExpired() приводит к истине, поэтому я думаю, что мне нужно обновить sh токен, но я понятия не имею, как.

1 Ответ

0 голосов
/ 17 июня 2020

После множества проб и ошибок я обнаружил, что мне пришлось использовать $client->fetchAccessTokenWithAssertion() вместо $client->getAccessToken().

public static function getGoogleServiceToken():?string {
    $keyFile = base_path() . '/keys/xxxxxxxx-xxxxxxx.json';
    $client = new Google_Client();
    $client->setAuthConfig($keyFile);
    $client->setApplicationName('Analytics Demo');
    $client->setAccessType('access_type');
    $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']);

    if ($client->isAccessTokenExpired()) {
        $token = $client->fetchAccessTokenWithAssertion();
    }
    else {
        $token = $client->getAccessToken();
    }

    return $token['access_token'];
}

Клиентская сторона:

...
private _handleGetResponse(response) {
    ...
    gapi.analytics.auth.authorize({
            serverAuth: {
                access_token: response.token,
            }
        });
    ...

Не уверен, почему по этому поводу вообще нет достойной документации. Даже зная, что мне нужно использовать этот метод, я не могу найти документацию о том, что на самом деле делает этот метод. Любые объяснения или ссылки на документацию по-прежнему приветствуются!

...