我们如何授予 google 文档 link 的访问权限或用户权限以与 PHP 的其他人共享?

How we can give access or user permissions to a google docs link to share with others with PHP?

我正在尝试使用 php 和 google docs api 向用户授予对 google docs 文件的权限,但我遇到了范围错误和权限错误。使用插入和创建权限方法时出现错误。 能否请您与我分享代码,如何授予用户对 google 文档文件的权限,以便使用 PHP 代码与他人共享,以及我必须使用哪种类型的范围和服务。

$fileId = $file->getId();
$role = 'writer';
$userEmail = 'user@gmail.com';
$fileId = $file->getId();

$userPermission = new Google_Service_Drive_Permission(array(
  'type' => 'user',
  'role' => $role,
  'emailAddress' => $userEmail
));

$request = $service->permissions->create(
  $fileId, $userPermission, array('fields' => 'id')
);

获取错误-

An error occurred: {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "insufficientPermissions",
    "message": "Insufficient Permission: Request had insufficient authentication scopes."
   }
  ],
  "code": 403,
  "message": "Insufficient Permission: Request had insufficient authentication scopes."
 }
}

这是我的文件-

<?php 
require __DIR__ . '/vendor/autoload.php';

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Drive API PHP Quickstart');
    $client->setScopes([
        Google_Service_Drive::DRIVE_FILE,
        Google_Service_Drive::DRIVE,
        Google_Service_Drive::DRIVE_METADATA_READONLY]);
    $client->setAuthConfig('credentials.json');
    $client->setAccessType('offline');
    $client->setPrompt('select_account consent');

    // Load previously authorized token from a file, if it exists.
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // 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()));
    }
    return $client;
}


// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Drive($client);

// Print the names and IDs for up to 10 files.
$optParams = array(
  'pageSize' => 10,
  'fields' => 'nextPageToken, files(id, name)'
);
$results = $service->files->listFiles($optParams);

if (count($results->getFiles()) == 0) {
    print "No files found.\n";
} else {
    print "Files:\n";
    foreach ($results->getFiles() as $file) {
        printf("%s (%s)\n", $file->getName(), $file->getId());
    }
}
$fileId = $file->getId();
// printf("%s",$fileId);

$newPermission = new Google_Service_Drive_Permission();
  $newPermission->setEmailAddress('user@gmail.com');
  $newPermission->setType('user');
  $newPermission->setRole('writer');
  try {
    return $service->permissions->create($fileId, $newPermission);
  } catch (Exception $e) {
    print "An error occurred: " . $e->getMessage();
  }
  return NULL;

permissions create 方法需要以下范围之一。

如果您遇到范围错误,请确保检查您授权用户使用的范围。此外,如果您更改了代码中的范围,请确保再次请求用户授权,您不希望 运行 使用旧权限使用过时的访问令牌。

如果我们检查您的代码

    Google_Service_Drive::DRIVE_FILE,
    Google_Service_Drive::DRIVE,
    Google_Service_Drive::DRIVE_METADATA_READONLY]);

您似乎添加了所有范围。我的猜测是,虽然您按顺序只有 DRIVE_METADATA_READONLY 您 运行 您的应用程序一次并授权用户。此时您的代码将用户凭据保存在 tokenPath 中。因此,即使您添加了新的范围,您的应用程序也没有向用户请求额外的权限。删除tokenPath中的文件,您的应用程序将再次请求授权。

权限错误是另外一回事。为了插入权限,您登录的用户必须是文件的所有者,只有他们才能插入权限。

google 文档 link 分享

如果您正在尝试创建可以在 Google 驱动器 Web 应用程序中创建的共享,不幸的是,API 无法做到这一点。为用户添加文件权限仅意味着该用户可以在其 google 驱动器帐户中访问该文件。

因为这是一个 Google 停靠栏,您可以使用 webview link 这将允许用户直接在他们的 google 文档帐户中打开文件。