获取 Google Analytics API 令牌/​​Google_Client getAccessToken returns 空/空

Get Google Analytics API token / Google_Client getAccessToken returns null / empty

我正在尝试获取服务帐户的 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() 也 returns null。

当我将 $client 放入 Google_Service_Analytics 对象时,一切似乎都工作正常,所以我知道密钥文件是正确的并且正确读取:

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

对可能出现的问题有什么想法吗?

更新:

调用 $client->isAccessTokenExpired() 结果为真,所以我想我必须刷新令牌,但我不知道如何刷新。

经过大量的尝试和错误我发现我必须使用 $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,
            }
        });
    ...

不知道为什么根本没有像样的文档。即使知道我必须使用这种方法,我也找不到关于这种方法实际作用的文档。仍然欢迎任何解释或指向某些文档的链接!