google oauth2 / calendar getRefreshToken返回NULL

问题描述 投票:1回答:1

我试图允许用户将他们的谷歌日历链接到我的系统,我已经得到它主要工作,并实际上有一段时间工作,但试图做一些修改它再次被打破:(

此页面将它们发送到谷歌:

require_once '../../resources/apis/google-api-php-client-2.2.1/vendor/autoload.php';

$client = new Google_Client();
$client->setAuthConfig('../../resources/apis/google-api-php-client-2.2.1/client_secret.json');
$client->setAccessType("offline");        // offline access
$client->setIncludeGrantedScopes(true);   // incremental auth
$client->addScope(Google_Service_Calendar::CALENDAR);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/sync/admin/apicomms/gcalmaster/syncFromGoogleCallback.php');
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

然后回调到这里:

require_once '../../resources/apis/google-api-php-client-2.2.1/vendor/autoload.php';

$client = new Google_Client();
$client->setAuthConfig('../../resources/apis/google-api-php-client-2.2.1/client_secret.json');
$client->setAccessType("offline");        // offline access
$client->setIncludeGrantedScopes(true);   // incremental auth
$client->addScope(Google_Service_Calendar::CALENDAR);
//$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/sync/admin/broadcast/syncFromGoogleCallback.php');
$client->authenticate($_GET['code']);

$refresh_token = $client->getRefreshToken();

var_dump($_GET);
var_dump($refresh_token);

回调页面正在显示

array(2) { ["code"]=> string(89) "x/xxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ["scope"]=> string(40) "https://www.googleapis.com/auth/calendar" } NULL

所以似乎认证顺利进行,它不会抛出任何错误......

我错过了什么导致我没有获得刷新令牌?我在https://myaccount.google.com/permissions下多次检查过以确保我的应用目前没有列出。

编辑:

我的应用程序中有另一个脚本正在运行,它执行实际同步,从数据库中提取刷新令牌,使用它获取访问令牌,并成功从日历API中提取事件。目前无法正常工作的是向我的应用添加新日历,即从新用户获取刷新令牌的过程

$refreshToken = $db->execute('pull refresh token from db');
require_once '../../resources/apis/google-api-php-client-2.2.1/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfig('../../resources/apis/google-api-php-client-2.2.1/client_secret.json');
$client->fetchAccessTokenWithRefreshToken($refreshTokenFromDB);
$service = new Google_Service_Calendar($client);
$calendarId = 'primary';
$optParams = array(
    'timeMin' => date('c'),
);
$results = $service->events->listEvents($calendarId, $optParams);

if (count($results->getItems()) == 0) {
    print "No upcoming events found.\n";
} else {
    //loop through stuff
}
php google-calendar-api google-oauth google-oauth2
1个回答
1
投票

你很亲密

因此,您似乎已成功获得授权代码。

然后使用您的授权码,您可以使用:

$client->authenticate($_GET['code']);  

请记住,这不是一个象征。这是授权码。

您现在必须使用授权代码请求访问令牌。

$accessToken = $client->getAccessToken();

这已经有一段时间了,因为我已经对此进行了修改,但我认为这也是您唯一能够请求刷新令牌的时间。

所以你接下来要做这一行:

 $refreshToken = $client->getRefreshToken();

您需要在系统某处的json文件中安全地保存这些令牌,以便下次要对此日历执行某些操作时使用。

因此,当您再次使用它时,您将使用$ accessToken与谷歌建立您的凭据。如果该访问令牌过期,则必须使用刷新令牌来获取新的访问令牌。我很确定刷新令牌保持不变。如果不是,它将与新的访问令牌一起发送。然后重新保存json文件。冲洗并重复。

更新

您将使用:

$client->fetchAccessTokenWithRefreshToken($refresh_token);

获取新的访问令牌。

© www.soinside.com 2019 - 2024. All rights reserved.