Google API PHP刷新令牌返回NULL

hmmo2u0o  于 2023-04-10  发布在  PHP
关注(0)|答案(5)|浏览(165)

我正在使用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',

也许这个对你有帮助

hsvhsicv

hsvhsicv1#

我有这个同样的问题很长一段时间.对我来说,这是因为,出于某种原因,谷歌只发送你的刷新令牌,你第一次请求令牌.所以你必须确保你存储的刷新令牌为该用户的所有的整体,因为谷歌不会再给予你.
对于开发来说,这可能是一个真实的的痛苦。您可以让Google向您发送新的刷新令牌,但您必须做的是取消授权您通过应用程序授权的任何帐户。您可以在your Google security settings.中完成此操作。
希望这有帮助!

juud5qan

juud5qan2#

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

dtcbnfnu

dtcbnfnu3#

我也遇到过类似的问题。查看我的详细答案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));
}
8ftvxx2r

8ftvxx2r4#

我的头撞在墙上很长一段时间。
这一点并不明显,但:
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));
}
t3irkdon

t3irkdon5#

我也有类似的问题,但是对于最新版本的PHP google apiclient库,当我将其更改为2.0时,一切都正常工作。
“google/apiclient”:“^2.0”,
现在我需要做的就是检查token是否处于活动状态,如果不是,然后请求一个新的token,作为响应,我会得到一个新的token和一个新的refreshtoken,我保存它以下载另一个token,依此类推。这是我的示例代码:

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

相关问题