Google API PHP Refresh Token返回NULL

时间:2014-05-01 16:59:54

标签: php google-api google-api-php-client

我正在使用适用于PHP的Google API客户端库进行离线身份验证,但是当我使用此代码时:

$this->google->refreshToken($result["google_refresh_token"]));

它返回NULL。

$this->google是指Google_Client类的一个实例。

任何人都知道这可能是什么?

如果我尝试更改给定的刷新令牌,则会返回Google异常错误,因此它应该是有效令牌。

谢谢!

编辑:

'client_id' => 'myclientid',
      'client_secret' => 'myclientsecret',
      'redirect_uri' => 'mypage',
      'developer_key' => 'mydeveloperkey',

      // Other parameters.
      'access_type' => 'offline',
      'approval_prompt' => 'force',

也许这有助于你

4 个答案:

答案 0 :(得分:9)

我有相同的问题已经有一段时间了。对我来说,这是因为,出于某种原因,Google只在您第一次请求令牌时向您发送刷新令牌。因此,您必须确保为该用户存储该刷新令牌的全部内容,因为Google不会再次将其提供给您。

对于发展来说,这可能是一个真正的痛苦。您可以让Google向您发送新的刷新令牌,但您要做的是取消授权您通过应用程序授权的任何帐户。您可以在your Google security settings.

中执行此操作

希望这有帮助!

答案 1 :(得分:5)

我现在使用一种非常简单的方法来避免使用refresh_token()方法。 我只是保存了第一个请求的整个JSON响应,并将其提供给setAccesToken()方法。如果访问令牌过期,它将自动从给定的JSON中获取一个新的。

答案 2 :(得分:3)

我遇到过类似的问题。查看我的详细答案here

这是快速解决方案

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    $newAccessToken = $client->getAccessToken();
    $accessToken = array_merge($accessToken, $newAccessToken);
    file_put_contents($credentialsPath, json_encode($accessToken));
}

答案 3 :(得分:0)

我很长时间撞在墙上。

这不是很明显,但是:

define('CREDENTIALS_PATH', '/vendor/google/credentials/credentials.json');

引用“credentials.json”的行或任何您的凭据文件将被调用 - 启动时该文件不应存在!如果您在获得授权之前创建了该文件,请删除它,然后访问您的脚本页面 - quickstart.php或其他任何内容,然后它会要求您授权。

如果您尝试反复刷新页面,则会出现使用限制(即请求授权次数太多),因此您可能需要在开发人员控制台中创建新的client_id并更新define('CLIENT_SECRET_PATH')路径

然后我添加了这个:

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
    $jsonCred = file_get_contents(CREDENTIALS_PATH);
    $jsonArray = json_decode($jsonCred, true);

    $client->fetchAccessTokenWithRefreshToken($jsonArray["refresh_token"]);

    $newAccessToken = $client->getAccessToken();
    $accessToken = array_merge($jsonArray, $newAccessToken);

    file_put_contents($credentialsPath, json_encode($accessToken));
}

```