Automatically refresh token using google drive api with php script

后端 未结 2 1374
我在风中等你
我在风中等你 2020-12-01 08:33

I followed again THIS TUTORIAL to upload a file on Google Drive with php, directly from my REMOTE SERVER: so I have created new API Project from Google API Console, enabled

相关标签:
2条回答
  • 2020-12-01 09:13

    You don't have to periodically ask for an access token. If you have a refresh_token, PHP client will automatically acquire a new access token for you.

    In order to retrieve an refresh_token, you need to set access_type to "offline" and ask for offline access permissions:

    $drive->setAccessType('offline');
    

    Once you get a code,

    $_GET['code']= 'X/XXX';
    $drive->authenticate();
    
    // persist refresh token encrypted
    $refreshToken = $drive->getAccessToken()["refreshToken"];
    

    For future requests, make sure that refreshed token is always set:

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

    If you want a force access token refresh, you can do it by calling refreshToken:

    $drive->refreshToken($refreshToken);
    

    Beware, refresh_token will be returned only on the first $drive->authenticate(), you need to permanently store it. In order to get a new refresh_token, you need to revoke your existing token and start auth process again.

    Offline access is explained in detail on Google's OAuth 2.0 documentation.

    0 讨论(0)
  • 2020-12-01 09:32

    After messing a lot I got this to work. I am using one file/script to get the offline token and then a class to do stuff with the 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>
    

    You can load refresh token from file and use it as necessary for offline access:

    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       
        }
    }
    

    More here: https://github.com/yannisg/Google-Drive-Uploader-PHP

    0 讨论(0)
提交回复
热议问题