Google setAccessToken,不知道作为参数传递什么

时间:2018-12-26 09:41:17

标签: php google-api

我正在获取我的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调用,但是在检查到期时失败。 (显然是因为我需要整个对象,而不仅仅是令牌字符串)但是那我该怎么做呢?

这种行为是奇怪的和违反直觉的。

1 个答案:

答案 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_tokenaccess_token也不一样。您应该阅读两者之间的区别。由于您没有提到要执行的操作或所使用的所有方法,因此仍然是一个猜测。

id_token vs access_token

希望可以为您提供一些见识。