我正在使用适用于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',
也许这有助于你
答案 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));
}
```