Php 在不登录的情况下验证Google Drive上载

Php 在不登录的情况下验证Google Drive上载,php,google-drive-api,google-oauth,google-api-php-client,google-api-client,Php,Google Drive Api,Google Oauth,Google Api Php Client,Google Api Client,需要您帮助将zip文件上载到google drive,而无需使用我的浏览器手动验证,以便我可以自动安排备份 我的身份验证和上传代码如下: $client = new Google_Client(); $client->setClientId('clientid'); $client->setClientSecret('clientsecret'); $client->setAccessType("offline"); $client-&g

需要您帮助将zip文件上载到google drive,而无需使用我的浏览器手动验证,以便我可以自动安排备份

我的身份验证和上传代码如下:

    $client = new Google_Client();
    $client->setClientId('clientid');
     $client->setClientSecret('clientsecret');
     $client->setAccessType("offline");


$client->setRedirectUri('http://localhost:60/pathtofile.php');
$client->setScopes(array('https://www.googleapis.com/auth/drive.file'));

session_start();

if (isset($_GET['code']) || (isset($_SESSION['access_token']) && $_SESSION['access_token'])) {
    if (isset($_GET['code'])) {
        $client->authenticate($_GET['code']);
        $_SESSION['access_token'] = $client->getAccessToken();
    } else
        $client->setAccessToken($_SESSION['access_token']);

    $service = new Google_Service_Drive($client);

    //Insert a file
    $file = new Google_Service_Drive_DriveFile();
    //$file->setName(uniqid().'.zip');
    $file->setName($zipName . '.zip');
    $file->setDescription('Testing document ZIP backups');
    $file->setMimeType('application/zip');

    $data = file_get_contents($zipPath = $publicPath . '\\removedorgname\\backups\\' . $zipName . '.zip');

    $createdFile = $service->files->create($file, array(
          'data' => $data,
          'mimeType' => 'application/zip',
          'uploadType' => 'multipart'
        ));

    print_r($createdFile);

} else {
    $authUrl = $client->createAuthUrl();
    header('Location: ' . $authUrl);
    exit();
}

我面临的问题是,它要求我手动登录谷歌帐户。我研究过刷新令牌的概念,但不知道如何实现它。

我想我已经找到了解决问题的方法,这是正确的还是错误的

  • 谷歌提示您登录时登录(仅第一次)
  • 既然您有了访问令牌(将过期),您需要刷新令牌

      $_SESSION['access_token'] = $client->getAccessToken();
    
        $token = $client->getAccessToken();
        var_dump($token;)
    
    您需要var_转储访问令牌,这将为您提供一个刷新代码

    一旦我有了刷新代码,我就使用这段代码来检查访问令牌是否过期,以及是否要使用刷新令牌来获取访问令牌

    if ($client->isAccessTokenExpired()) {
    
         $client->fetchAccessTokenWithRefreshToken('removedtoken');
    
     }
    

    我仍然需要从该访问令牌中提取新的刷新令牌,并将刷新令牌保存在某个地方,以便在该访问令牌过期时使用。

    这是无意义的。最好使用服务帐户代表您。您不需要设置服务帐户,可以使用refreshtoken进行授权。无论如何,我已经找到了我的问题的解决方案,我将在下面发布,以备其他人需要。有人能向我解释一下,与服务帐户相比,这样做的负面影响是什么吗?您可能a)必须手动交互(与规定的要求相反)或b)将暴露您的备份(如您在要求中所述)向公众,以防上传到公共目录。嗨,马丁,虽然之前我必须手动登录,但现在谷歌自动从刷新令牌获取访问令牌并进行身份验证。我的备份如何向公众公开,是因为我将其存储在公共路径中,因为这仅用于测试目的,并且在运行时,我会将备份zip文件和此代码存储在服务器上的私人文件夹中。假设您请求脱机访问,那么您就知道令牌对象将包含一个刷新令牌,您可以安全地存储该令牌,并使用它来请求访问令牌,而无需登录。