Google API PHP刷新令牌返回NULL


Google API PHP Refresh Token returns NULL

我使用Google API Client Library for PHP进行离线身份验证,但当我使用以下代码时:

$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',

也许这有助于

我遇到同样的问题已经有很长一段时间了。对我来说,这是因为,出于某种原因,谷歌只在你第一次请求刷新令牌时才向你发送刷新令牌。所以你必须确保你为该用户存储了完整的刷新令牌,因为谷歌不会再给你了。

对于发展来说,这可能是一个真正的痛苦。你可以让谷歌向你发送一个新的刷新令牌,但你要做的是取消你通过应用程序授权的任何帐户的授权。你可以在你的谷歌安全设置中这样做。

希望这能有所帮助!

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

我也遇到过类似的问题。在这里查看我的详细答案

这是的快速解决方案

// 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));
}

我的头撞在墙上很长一段时间了。

这一点并不明显,但:

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));
}

```

我也有类似的问题,但对于最新版本的PHP谷歌apiclient库,当我将其更改为2.0时,一切都正常工作。

"google/apiclient":"2.0〃;,

现在我所要做的就是检查令牌是否处于活动状态,如果不是,那么请求一个新令牌,作为回应,我得到了一个新的令牌和一个新刷新令牌,我将其保存以下载另一个,以此类推。这是我的示例代码:

$google_client = new 'Google_Client();
$google_client->setClientId('');
$google_client->setClientSecret('');
$google_client->setRedirectUri('');
$google_client->addScope('email');
$google_client->addScope('profile');
$google_client->addScope(Gmail::GMAIL_READONLY);
$google_client->setAccessType ("offline");
$google_client->setApprovalPrompt ("force");
if( !$google_client->isAccessTokenExpired() ) {
   $refreshToken = $google_client->fetchAccessTokenWithRefreshToken( Session::get( 'refresh_token' ) );
}