我试图允许用户将他们的谷歌日历链接到我的系统,我已经让它大部分都在工作,并且实际上让它工作了一段时间,但是试图对它进行一些修改' 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
}
答案 0 :(得分:1)
你很亲密。
所以看起来你成功获得了授权码。
然后使用您的授权码:
$client->authenticate($_GET['code']);
请记住,这不是令牌。这是授权码。
您现在必须使用授权码请求访问令牌。
$accessToken = $client->getAccessToken();
我已经有一段时间了,因为我已经对此进行了修改,但我认为这也是您唯一能够请求刷新令牌的时间。
所以你接下来要做这一行:
$refreshToken = $client->getRefreshToken();
您需要在系统某处的json文件中安全地保存这些令牌,以便在下次要对此日历执行某些操作时使用。
因此,当您再次使用此功能时,您将使用$ accessToken与Google建立您的凭据。如果该访问令牌过期,则必须使用刷新令牌来获取新的访问令牌。我非常确定刷新令牌保持不变。如果不是,它将与新的访问令牌一起发送。然后重新保存json文件。冲洗并重复。
已更新
您将使用:
$client->fetchAccessTokenWithRefreshToken($refresh_token);
获取新的访问令牌。