Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Google Events API返回401错误未经授权的\u客户端_Php_Laravel_Google Calendar Api - Fatal编程技术网

Php Google Events API返回401错误未经授权的\u客户端

Php Google Events API返回401错误未经授权的\u客户端,php,laravel,google-calendar-api,Php,Laravel,Google Calendar Api,我在laravel中创建了一个应用程序,当我在浏览器中运行它时,它可以将我数据库中的用户日历与一切正常工作的东西同步 但它在我的cron中返回401个未经授权的\u客户端,这两个文件中实现的代码完全相同 $client = $this->getGoogleClient(); $client->setAccessToken($accessToken); if ($client->isAccessTokenExpired()) {

我在laravel中创建了一个应用程序,当我在浏览器中运行它时,它可以将我数据库中的用户日历与一切正常工作的东西同步

但它在我的cron中返回401个未经授权的\u客户端,这两个文件中实现的代码完全相同

        $client = $this->getGoogleClient();
        $client->setAccessToken($accessToken);
        if ($client->isAccessTokenExpired()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        }
        $gCalService = new Google_Service_Calendar($client);
        $optArr = array();
        $calendarId = 'primary';
        $pageToken = NULL;
        $responceEvents = array();
        $synced = $emailSync->getGoogleSynced();
        if($synced != null)
            $optArr['syncToken'] = $synced->sync_token;

        do {
            if ($pageToken) {
                $optArr['pageToken'] = $pageToken;
            }
            try {
                $results = $gCalService->events->listEvents($calendarId,$optArr);
            }
            catch (Google_Service_Exception $e) {
                $msg = $e->getMessage();
                return $msg;
            }
            if ($results->getItems()) {
                $responceEvents = array_merge($responceEvents, $results->getItems());
                $pageToken = $results->getNextPageToken();
            }
        } while ($pageToken);
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken())

返回以下错误

Array
(
    [error] => unauthorized_client
    [error_description] => Unauthorized
)
调试的代码逐行
$client->getRefreshToken()
也包含我在这里传递的值
$client->setAccessToken($accessToken)完全相同的代码在我的浏览器文件中工作正常,在我的cron中不工作

401未经授权的客户机

表示您的代码未经授权。如果您想访问私人用户数据,则需要登录。您的代码需要访问令牌才能访问Google api

您应该做的是在浏览器中使用Oauth2对代码进行一次授权—将刷新令牌保存到某个地方,让cron作业读取刷新令牌,并在运行之前请求新的访问令牌

假设您拥有您试图插入的帐户,也可能需要考虑使用服务帐户。

刷新令牌

如果将刷新令牌存储在数据库中,则必须先将其分配给客户机,然后再运行代码。在这里,我使用存储在会话变量中的刷新令牌执行此操作

$client->refreshToken($_SESSION['refresh_token']);

您如何验证cron作业?不需要任何授权。即使在cron中,访问私人用户数据也始终需要授权。我将所有内容都保存在数据库中相同的代码完全正常工作。我希望它正常工作,但在cron中添加该代码时,它停止工作。因为cron没有读取您的刷新令牌或正在获取新的访问令牌。让它为你写一个文件,这样你就可以看到它了。请将剩下的代码发布到$client->getRefreshToken()集合的位置?@dalmt要检查我在问题中发布的代码,我正在获取两个函数中的所有数据。你说它存储在数据库中?当代码运行时,您需要获取刷新令牌并使用它填充客户端或通过web浏览器与用户登录。刚刚调试的
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken())不刷新accessToken。