我正在获取我的Google访问令牌,
我将其设置为
$client->setAccessToken($token)
这对我有用,已经存在了很长时间。香港专业教育学院一直在使用它的API调用,它的工作原理。但是,我直到最近才开始研究应用程序的新功能。我遇到了一个问题/..
当我想通过使用isAccessTokenExpired检查此令牌是否过期时。
$client->isAccessTokenExpired()
我知道
undefined index : expires in
我四处搜寻,显然您必须将整个JSON编码的整个字符串传递到setAccessToken中。不只是令牌。 (这很奇怪,因为为什么令牌只能用于API调用?)
但是,现在当我这样做时...
$token = json_decode($usersToken);
$client->setAccessToken($token);
我知道
Cannot use object of type stdClass as array
然后我尝试将stdClass转换为数组
$token = json_decode($usersToken, true);
$client->setAccessToken($token);
然后我得到
Invalid Token Format Client.php line 433
要使它有效,我必须将什么传递给setAccessToken?
为什么只传递令牌可用于API调用,但是在检查到期时失败。 (显然是因为我需要整个对象,而不仅仅是令牌字符串)但是那我该怎么做呢?
这种行为是奇怪的和违反直觉的。
答案 0 :(得分:0)
因此,根据您所提出问题的信息,我将对您的问题做出假设。如果这样做没有帮助,在您发布更多代码供我们查看之后,我将重新讨论该问题。
您的包含用户令牌的JSON文件在解码后应如下所示:
$token = array(
'access_token' => 'token value',
'expires_in' => 3600,
'scope' => 'a url specifying scope',
'token_type' => 'Bearer',
'created' => 'a timestamp for created date',
'refresh_token' => 'refresh token value'
);
此数组可以作为数组传递给$client->setAccessToken($token)
。
如果您认为您的脚本仅在调用实际的访问令牌,那么:
$client->setAccessToken($token['access_token']);
如果您运行$client->isAccessTokenExpired()
,并且遇到类似您在问题中发布的错误,则可能会认为您的令牌缺少expires_in
字段和created
字段。
isAccessTokenExpired()
将返回布尔响应。请注意,您没有向函数传递任何内容,因为$client
应该已经具有测试令牌是否过期所需的信息。
如果您的令牌没有我上面发布的值,则必须获取具有适当范围的新令牌。
获取新令牌的一般流程是:
取自Google Calendar API Quickstart Guide - PHP
// If there is no previous token or it's expired.
if ($client->isAccessTokenExpired()) {
// Refresh the token if possible, else fetch a new one.
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
} else {
// Request authorization from the user.
$authUrl = $client->createAuthUrl();
printf("Open the following link in your browser:\n%s\n", $authUrl);
print 'Enter verification code: ';
$authCode = trim(fgets(STDIN));
// Exchange authorization code for an access token.
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);
// Check to see if there was an error.
if (array_key_exists('error', $accessToken)) {
throw new Exception(join(', ', $accessToken));
}
}
// Save the token to a file.
if (!file_exists(dirname($tokenPath))) {
mkdir(dirname($tokenPath), 0700, true);
}
file_put_contents($tokenPath, json_encode($client->getAccessToken()));
}
确保正确设置了客户端对象:
$scopes = implode(' ',
array(Google_Service_Calendar::CALENDAR)
);
$client = new Google_Client();
$client->setAuthConfig('path to credentials');
$client->addScope($scopes);
$client->setAccessType('offline');
id_token
和access_token
也不一样。您应该阅读两者之间的区别。由于您没有提到要执行的操作或所使用的所有方法,因此仍然是一个猜测。
希望可以为您提供一些见识。