2016-09-19 174 views
1

因此,我从字面上复制了Google示例代码(https://developers.google.com/google-apps/calendar/quickstart/php)中的代码,并尽可能按照其说明操作,然后我的日历工作得很好。但我今天进来了,意识到它停止了工作,我无法弄清楚什么是错的。Google Calendar API getRefreshToken

我相信我的问题的根源是这一行:

$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); 

,因为该行给了我这个错误

未捕获LogicException:刷新令牌必须传入或设置为setAccessToken的一部分

也有类似的问题(Get refresh token google api,Not receiving Google OAuth refresh token)但我似乎不能这样我的问题与他们的答案。

另一个说明; $client->getRefreshToken()似乎在返回null当我测试它,这就是为什么我认为$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());失败。


所以这是一段代码直接从是有问题的例子

// Refresh the token if it's expired. 
if ($client->isAccessTokenExpired()) { 
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); 
    file_put_contents($credentialsPath, json_encode($client->getAccessToken())); 
} 

这一段代码给我的错误,因为$client->getRefreshToken()null,但我是我所需要的前提下,使用刷新令牌获取新令牌,如果没有刷新令牌,我不能这样做?


另外请注意,这已经被设定在通话开始时

$client->setAccessType('offline'); 
$client->setApprovalPrompt('force'); 

回答

1

请注意,访问令牌的使用寿命有限,当它发生时,这会导致您的日历停止工作。因此,如Token expiration中所建议的那样,您应该在代码中编写预测授予的令牌可能不再有效的可能性。这是刷新令牌变得非常有用的地方,它允许您的应用程序获得新的访问令牌,而无需再次通过授权过程。

要请求refresh token,请将access_type=offline添加到您的验证请求中。但是,此GitHub post建议您可以通过在请求中提供参数 access_type=offline&approval_prompt=force来获取刷新令牌。

欲了解更多有用的技巧,我认为下面的链接将是有益的:

+0

是的,我已经设置的标志,因为他们在这个例子中。而且我知道它应该被刷新,这就是线条评论为'刷新标记,如果它过期.'应该是做的,但我没有得到一个新的关键 –

+0

我已经添加了一部分我的问题有希望进一步澄清 –