1

我正在为应用程序使用Oauth 类来访问 Google 驱动器 API,我同时拥有刷新和访问令牌,现在我需要做的就是设置请求的参数。

我的问题是我似乎找不到获得适当响应所需的参数,我查看了 OAuth 游乐场,发送的请求有三个标头AuthorizationHost并且Content length.

我正在使用的类应该正确处理这些标头,并且我很确定它正在做正确的事情,因为它实际上正确地接收了codeand access/refresh tokens

当我发送请求时,Google 会返回一个错误;

StdClass Object
(
[error] => stdClass Object
    (
        [errors] => Array
            (
                [0] => stdClass Object
                    (
                        [domain] => global
                        [reason] => authError
                        [message] => Invalid Credentials
                        [locationType] => header
                        [location] => Authorization
                    )
            )
        [code] => 401
        [message] => Invalid Credentials
    )
)


这肯定表明凭据无效?但如果我刚刚收到“新”访问令牌和刷新令牌,这肯定没问题吗?这是我发送的请求(根据 OAuth 类方法)。

$row = $this->docs_auth->row();

$this->client                = new oauth_client_class;
$this->client->server        = 'Google';
$this->client->redirect_uri  = 'https://localhost/p4a/applications/reflex_application/index.php';
$this->client->debug         = true;
$this->client->client_id     = REFLEX_GOOGLE_CLIENT;
$this->client->client_secret = REFLEX_GOOGLE_SECRET;
$this->client->access_token  = $row['access_token'];
$this->client->refresh_token = $row['refresh_token'];


$url = 'https://www.googleapis.com/drive/v2/files';

$Values = array(
    'access_token'  => $this->client->access_token,
    'client_id'     => $this->client->client_id,
    'client_secret' => $this->client->client_secret
);
/*
 * Request: GET https://www.googleapis.com/drive/v2/files
 * $values = the values sent in the request
 * $folder = the response returned from Google.
 */

$this->client->callAPI($url, 'GET', $values, array(
    'FailOnAccessError' => false
), $folder);


$this->field->setValue(print_r($folder, true));

所以我的问题是,要发送给 Google 以获取文件夹和文件列表的正确参数是什么,以及请求所需的标头是什么(我不想过多地编辑类,但已经需要)。

谢谢你的时间

4

2 回答 2

2

查看您发布的链接以及原始类创建者编写的示例,您可以在调用 callAPI() 之前调用类的 Initialize()。

这是他使用的示例:

if(($success = $client->Initialize()))
{
    if(($success = $client->Process()))
    {
        if(strlen($client->authorization_error))
        {
            $client->error = $client->authorization_error;
            $success = false;
        }
        elseif(strlen($client->access_token))
        {
            $success = $client->CallAPI(
                'https://www.googleapis.com/oauth2/v1/userinfo',
                'GET', array(), array('FailOnAccessError'=>true), $user);
        }
    }
    $success = $client->Finalize($success);
}
于 2013-02-21T10:18:06.750 回答
0

在离开这个几个月并回来之后,我终于得到了你正在寻找的方法,虽然我使用了谷歌自己的类:

方法大致相同;

首先调用类$this->client = new Google_Client();

然后设置获取特定客户端响应所需的所有元数据,设置范围并设置访问类型:

    // Get your credentials from the APIs Console
    $this->client->setClientId($this->client_id);
    $this->client->setClientSecret($this->client_secret);
    $this->client->setRedirectUri($this->redirect_uri);
    $this->client->setScopes(array('https://www.googleapis.com/auth/drive ','https://www.googleapis.com/auth/drive.file' ));
        $this->client->setAccessType("offline");

然后最后获取您存储的访问令牌(在数据库中或存储在会话中)并使用Google_DriveService($this->client)类中的这些函数来执行文件列表:

try{

            $json = json_encode($this->loadAccessTokenFromDB());

            $this->client->setAccessToken($json);
            $this->client->setUseObjects(true);
            $service = new Google_DriveService($this->client);

            $parameters = array();
            $parameters['q'] = " FullText contains '" . $searchString . "'";
            $files = $service->files->listFiles($parameters);
            $ourfiles = $files->getItems();

            $fileArray = array();

            foreach ( $ourfiles as $file )
            {
                $fileArray[] = array(
                        'title'          => $file->getTitle(),
                        'id'             => $file->getID(),
                        'created'        => $file->getCreatedDate(),
                        'embedlink'      => $file->getEmbedLink(),
                        'exportlinks'    => $file->getExportLinks(),
                        'thumblink'      => $file->getThumbnailLink(),
                        'mimeType'       => $file->getMimeType(),
                        'webContentLink' => $file->getWebContentLink(),
                        'alternateLink'  => $file->getAlternateLink(),
                        'permissions'    => $file->getUserPermission()
                );
            }
            //$this->mimeType = $file->getMimeType();
            $this->documents->load($fileArray);
            if ($fileArray["id"] !== "")
            {
                $this->documents->firstRow();

                return;
            }
        } catch(Google_AuthException $e) {
            print $e->getMessage();
        }
        return;
    }

我还在对可以使用的搜索字符串进行测试,从我设法测试的内容来看,该字符串必须是一个没有中断的字符串,它将搜索包含该特定字符串的任何内容,例如

foo会给出包含以下词的文档:foo foobar等但不会找到foo bar所以你必须小心,理想情况下,如果它是用户或任何东西的特定文档,你应该寻找一个特定的唯一字符串来搜索,

再次感谢。

于 2013-05-29T10:18:35.420 回答