我需要从Google云端硬盘上的公开标记文件夹中获取文件列表。
即使文件夹被标记为公开,Drive API仍然需要我的代码才能发送经过身份验证的请求 - 足够公平。
但是,我没有被正确授权。相反,我收到一个错误:“刷新OAuth2令牌时出错,消息:'{”error“:”unauthorized_client“}',我看不出原因。
<?php
require_once 'google-api-php-client/src/Google/autoload.php';
require_once 'google-api-php-client/src/Google/Client.php';
require_once 'google-api-php-client/src/Google/Service/Drive.php';
require_once 'google-api-php-client/src/Google/Service/Oauth2.php';
// session_start();
define('DRIVE_SCOPE', 'https://www.googleapis.com/auth/drive');
define('SERVICE_ACCOUNT_EMAIL', 'blablablablabla-blablablabla51@developer.gserviceaccount.com');
define('SERVICE_ACCOUNT_PKCS12_FILE_PATH', 'Bla-blabla29db83.p12');
/**
* Build and returns a Drive service object authorized with the service accounts
* that acts on behalf of the given user.
*
* @param userEmail The email of the user.
* @return Google_Service_Drive service object.
*/
function buildService($userEmail) {
$key = file_get_contents(SERVICE_ACCOUNT_PKCS12_FILE_PATH);
$auth = new Google_Auth_AssertionCredentials(
SERVICE_ACCOUNT_EMAIL,
array(DRIVE_SCOPE),
$key);
$auth->sub = $userEmail;
$client = new Google_Client();
$client->setAssertionCredentials($auth);
// This fails:
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
return new Google_Service_Drive($client);
}
/**
* Print files belonging to a folder.
*
* @param Google_Service_Drive $service Drive API service instance.
* @param String $folderId ID of the folder to print files from.
*/
function printFilesInFolder($service, $folderId) {
// Omitted code
}
$service = buildService('blablabla@gmail.com');
printFilesInFolder($service, 'blablablablablablablabla');
?>
正确输入了服务电子邮件帐户和pkcs12文件。
我在想$ userEmail地址。在某个地方我应该在服务和地址之间建立关系吗?目前我正在使用拥有该项目的邮件地址,并设置了正在使用的OAuth2证书。
这使用最新的Drive API。我发现了其他问题和解释,但它们通常依赖于过时的Documents API。
我正在尝试从命令行运行代码,而不是从网页运行代码。