我编写了一个脚本,该脚本使用PHP SDK成功地向谷歌查询访问令牌。
我的代码,
require_once('_/libs/google/apiclient/autoload.php');
$client_id = '<MY_ID>';
$client_secret = '<MY_SECRET>';
$redirect_uri = '<REDIRECT_URL>';
// Config my apps information
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://mail.google.com/");
// When google redirects with code swap for access token
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
<------------- Try to get both tokens ----------------->
$_SESSION['access_token'] = $client->getAccessToken();
$_SESSION['refresh_token'] = $client->getRefreshToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}
一旦我获得如上所示的身份验证代码并通过getAccessToken();
查询访问令牌,它就会返回创建和到期时间。
但是,当我通过getRefreshToken();
查询刷新令牌时,它在将其输出到屏幕时不返回任何内容。
在这里也提出了类似的问题
问题似乎是让谷歌知道你需要离线访问,但这个问题的答案不能转移到PHP SDK中。
虽然我使用的是JavaScript,但我只是遇到了完全相同的问题。我通过在初始令牌请求调用中添加redirect_uri参数来解决这个问题。
这是我的SO文章和我的解决方案:Google API-Outh 2.0 Auth令牌流
为了澄清流程,要获得刷新令牌,实际上必须请求从谷歌获得"代码"(因此是我的参数'response_type': 'code'
),然后用该代码进行另一次调用以获得访问令牌和刷新令牌。