1

アプリが Google ドライブ API にアクセスするためにOauth クラスを使用しています。リフレッシュ トークンとアクセス トークンの両方があり、ボールを転がすために必要なのは、リクエストのパラメーターを設定することだけです。

私の問題は、適切な応答を取得するために必要なパラメーターが見つからないように見えることです。OAuth プレイグラウンドを調べたところ、送信された要求には 3 つのヘッダーAuthorizationAnd Hostがあり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

これを数か月放置して戻ってきた後、Google 独自のクラスを使用していましたが、最終的に探していたメソッドを取得しました。

方法はほぼ同じです。

最初にクラスを呼び出します$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 に答える