我们如何授予 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 文档帐户中打开文件。
我正在尝试使用 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 文档帐户中打开文件。