web-dev-qa-db-ja.com

phpスクリプトでグーグルドライブAPIを使用してトークンを自動的に更新します

もう一度フォローしました このチュートリアル リモートサーバーから直接、phpを使用してGoogleドライブにファイルをアップロードしました。GoogleAPIコンソールから新しいAPIプロジェクトを作成し、ドライブAPIサービスを有効にして、リクエストしましたOAuthクライアントIDとクライアントシークレット、スクリプトで記述し、 Google APIクライアントライブラリforPHP フォルダーと一緒にこの http://www.MYSERVER .com/script1.php 、認証コードを取得するには:

<?php

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_DriveService.php';

$drive = new Google_Client();

$drive->setClientId('XXX'); // HERE I WRITE MY Client ID

$drive->setClientSecret('XXX'); // HERE I WRITE MY Client Secret

$drive->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');

$drive->setScopes(array('https://www.googleapis.com/auth/drive'));

$gdrive = new Google_DriveService($drive);

$url = $drive->createAuthUrl();
$authorizationCode = trim(fgets(STDIN));

$token = $drive->authenticate($authorizationCode);

?>

http://www.MYSERVER.com/script1.php I許可にアクセスして、次の認証コードを取得すると2番目のスクリプトで書くことができます。次に、それを http://www.MYSERVER.com/script2.php にアップロードします。

<?php

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_DriveService.php';

$drive = new Google_Client();

$drive->setClientId('X');  // HERE I WRITE MY Client ID
$drive->setClientSecret('X');  // HERE I WRITE MY Client Secret
$drive->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');
$drive->setScopes(array('https://www.googleapis.com/auth/drive'));

$gdrive = new Google_DriveService($drive);

$_GET['code']= 'X/XXX'; // HERE I WRITE AUTH CODE RETRIEVED AFTER RUNNING REMOTE script.php

file_put_contents('token.json', $drive->authenticate());

$drive->setAccessToken(file_get_contents('token.json'));

$doc = new Google_DriveFile();

$doc->setTitle('Test Drive');
$doc->setDescription('Document');
$doc->setMimeType('text/plain');

$content = file_get_contents('drive.txt');

$output = $gdrive->files->insert($doc, array(
      'data' => $content,
      'mimeType' => 'text/plain',
    ));

print_r($output);

?>

さて、ファイルdrive.txtが私のGoogleドライブにアップロードされ、token.jsonファイルの構造は次のようなものです。

{"access_token":"XXX","token_type":"Bearer","expires_in":3600,"refresh_token":"YYY","created":1365505148}

これで、ご想像のとおり、script2.phpを呼び出して、特定の時間までファイルをアップロードできます。最後に、要点は次のとおりです。Iトークンの有効期限が切れない、許可したくない有効期限が切れるたびに(script1.phpを呼び出す):ファイルを自動的にアップロードするために、日中定期的にscript2.phpを呼び出す必要がありますなしユーザーインタラクション。では、このコンテキストでトークンを永久に自動的に更新するための最良の方法は何ですか?別のスクリプトが必要ですか? script2.phpにコードを追加できますか?またはtoken.jsonファイルを変更しますか?また、トークンの有効期限が切れるまでの残り時間をどこで読み取ることができますか?ありがとう!

8
Huxley

定期的にアクセストークンを要求する必要はありません。 refresh_tokenがある場合、PHPクライアントは自動的に新しいアクセストークンを取得します。

Refresh_tokenを取得するには、access_typeを「offline」に設定し、オフラインアクセス許可を要求する必要があります。

_$drive->setAccessType('offline');
_

codeを取得したら、

_$_GET['code']= 'X/XXX';
$drive->authenticate();

// persist refresh token encrypted
$refreshToken = $drive->getAccessToken()["refreshToken"];
_

今後のリクエストのために、更新されたトークンが常に設定されていることを確認してください。

_$tokens = $drive->getAccessToken();
$tokens["refreshToken"] = $refreshToken;
$drive->setAccessToken(tokens);
_

強制アクセストークンの更新が必要な場合は、refreshTokenを呼び出すことで実行できます。

_$drive->refreshToken($refreshToken);
_

_refresh_token_は最初の$drive->authenticate()でのみ返されることに注意してください。永続的に保存する必要があります。新しいrefresh_tokenを取得するには、既存のトークンを取り消して、認証プロセスを再開する必要があります。

オフラインアクセスについては、 GoogleのOAuth 2.0ドキュメント )で詳しく説明されています。

30
Burcu Dogan

たくさんいじった後、私はこれを機能させました。 1つのファイル/スクリプトを使用してオフライントークンを取得し、次にクラスを使用してAPIを使用しています。

require_once 'src/Google/autoload.php'; // load library

session_start();

$client = new Google_Client();
// Get your credentials from the console
$client->setApplicationName("Get Token");
$client->setClientId('...');
$client->setClientSecret('...');
$client->setRedirectUri('...'); // self redirect
$client->setScopes(array('https://www.googleapis.com/auth/drive.file'));
$client->setAccessType("offline");
$client->setApprovalPrompt('force'); 



if (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
    $_SESSION['token'] = $client->getAccessToken();
    $client->getAccessToken(["refreshToken"]);
    $redirect = 'http://' . $_SERVER['HTTP_Host'] . $_SERVER['PHP_SELF'];
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
    return;
}

if (isset($_SESSION['token'])) {
    $client->setAccessToken($_SESSION['token']);
}

if (isset($_REQUEST['logout'])) {
    unset($_SESSION['token']);
    $client->revokeToken();
}


?>
<!doctype html>
<html>
    <head><meta charset="utf-8"></head>
    <body>
        <header><h1>Get Token</h1></header>
        <?php
        if ($client->getAccessToken()) {
            $_SESSION['token'] = $client->getAccessToken();
            $token = json_decode($_SESSION['token']);
            echo "Access Token = " . $token->access_token . '<br/>';
            echo "Refresh Token = " . $token->refresh_token . '<br/>';
            echo "Token type = " . $token->token_type . '<br/>';
            echo "Expires in = " . $token->expires_in . '<br/>';
            echo "Created = " . $token->created . '<br/>';
            echo "<a class='logout' href='?logout'>Logout</a>";
            file_put_contents("token.txt",$token->refresh_token); // saving access token to file for future use
        } else {
            $authUrl = $client->createAuthUrl();
            print "<a class='login' href='$authUrl'>Connect Me!</a>";
        }
        ?>
    </body>
</html>

ファイルから更新トークンをロードし、オフラインアクセスに必要に応じて使用できます。

class gdrive{

function __construct(){
        require_once 'src/Google/autoload.php';
        $this->client = new Google_Client();
}

function initialize(){
        echo "initializing class\n";
        $client = $this->client;
        // credentials from google console
        $client->setClientId('...');
        $client->setClientSecret('...');
        $client->setRedirectUri('...');

        $refreshToken = file_get_contents(__DIR__ . "/token.txt"); // load previously saved token
        $client->refreshToken($refreshToken);
        $tokens = $client->getAccessToken();
        $client->setAccessToken($tokens);

        $this->doSomething(); // go do something with the api       
    }
}

詳細はこちら: https://github.com/yannisg/Google-Drive-Uploader-PHP

1
Yannis Giovanos