google oauth2 / calendar getRefreshToken返回NULL

时间:2018-04-29 06:07:19

标签: php google-calendar-api google-oauth google-oauth2

我试图允许用户将他们的谷歌日历链接到我的系统,我已经让它大部分都在工作,并且实际上让它工作了一段时间,但是试图对它进行一些修改' s再次破碎:(

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

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中提取事件。目前没有工作的是“添加”#39;我的应用程序的新日历,从新用户获取刷新令牌的过程

$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
}

1 个答案:

答案 0 :(得分:1)

你很亲密。

所以看起来你成功获得了授权码。

然后使用您的授权码:

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

请记住,这不是令牌。这是授权码。

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

$accessToken = $client->getAccessToken();

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

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

 $refreshToken = $client->getRefreshToken();

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

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

已更新

您将使用:

$client->fetchAccessTokenWithRefreshToken($refresh_token);

获取新的访问令牌。