2017-09-07 66 views
1

我正在實施對​​在PHP中的答案,對此,this question中已經轉換了代碼。如何使用Google Drive的REST API檢查訪問令牌是否有效?

$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=$access_token") ; 
    curl_setopt($ch, CURLOPT_PORT , 443) ; 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false) ; 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1) ; 
    curl_setopt($ch, CURLOPT_HEADER, false) ; 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded")) ; 

    $response = curl_exec($ch) ; 
    error_log($response); 

當我運行的代碼,但是,我得到:

HTTP/1.1 400 Bad Request 
Vary: X-Origin 
Content-Type: application/json; charset=UTF-8 
Date: Wed, 06 Sep 2017 22:29:24 GMT 
Expires: Wed, 06 Sep 2017 22:29:24 GMT 
Cache-Control: private, max-age=0 
X-Content-Type-Options: nosniff 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 
Server: GSE 
Alt-Svc: quic=":443"; ma=2592000; v="39,38,37,35" 
Accept-Ranges: none 
Vary: Origin,Accept-Encoding 
Transfer-Encoding: chunked 

{ 
"error": "unsupported_grant_type", 
"error_description": "Invalid grant_type: " 
} 

我的後場是完全一樣的格式,因爲它們是在JavaScript的答案,甚至URL編碼,因爲他們不是在PHP中。我在Google's OAuth 2.0 Playground中打開了相同的刷新令牌,並且在嘗試刷新我的訪問令牌時收到相同的消息。

+0

爲什麼不嘗試[PHP快速入門,而不是(https://developers.google.com/drive/v3/web/quickstart/php)?它有一個刷新令牌的樣本,當它過期時。 – noogui

+0

@noogui這必須自動執行,據我所知PHP庫需要同意。 – NobleUplift

+0

先試一試。 – noogui

回答

0

兩週前完成,忘了發佈我自己的答案。下面是我爲獲得令牌和下載文件創建的方法:

const CLIENT_ID = ""; 
const CLIENT_SECRET = ""; 

private $refresh_token; 
private $access_token; 
private $file_id; 
private $output_path; 
private $token_filename; 

public function is_token_valid() { 
    $startTime = new \DateTime(); 

    error_log('[' . $startTime->format('Y-m-d h:i:s') . '] Checking if access token ' . trim($this->access_token) . ' is valid...'); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=" . urlencode($this->access_token)); 
    curl_setopt($ch, CURLOPT_PORT, 443); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $response = curl_exec($ch); 

    error_log('[' . $startTime->format('Y-m-d h:i:s') . '] Checking token information...'); 
    if ($response === false) { 
     error_log('[' . $startTime->format('Y-m-d h:i:s') . '] Error while checking access token...'); 
     throw new \Exception("Token check triggered cURL error " + curl_errno($ch) . ": " . curl_error($ch)); 
    } 

    $response = json_decode($response, true); 

    return !(isset($response['error']) || isset($response['error_description'])); 
} 

public function get_access_token() { 
    $startTime = new \DateTime(); 
    $post_fields = "grant_type=refresh_token&client_id=" . urlencode(self::CLIENT_ID) . "&client_secret=" . urlencode(self::CLIENT_SECRET) . "&refresh_token=" . urlencode($this->refresh_token); 

    error_log('[' . $startTime->format('Y-m-d h:i:s') . '] Getting access token for refresh token ' . urlencode($this->refresh_token) . ' ...'); 
    //error_log($post_fields); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/oauth2/v4/token"); 
    curl_setopt($ch, CURLOPT_PORT , 443); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded")); 
    $response = curl_exec($ch); 
    $response = json_decode($response, true); 

    if ($response === false) { 
     throw new \Exception("Fetching access token triggered cURL error " + curl_errno($ch) . ": " . curl_error($ch)); 
    } 

    if (!isset($response['access_token'])) { 
     throw new \Exception("Error fetching access token: " . json_encode($response)); 
    } 
    $this->access_token = $response['access_token']; 
    file_put_contents($this->token_filename, $this->access_token); 

    return $this->access_token; 
} 

public function download_file() { 
    $startTime = new \DateTime(); 
    $url = "https://www.googleapis.com/drive/v3/files/{$this->file_id}/export?mimeType=text/csv"; 

    error_log('[' . $startTime->format('Y-m-d h:i:s') . '] Downloading CSV with URL ' . $url . ' ...'); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_PORT , 443); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: Bearer " . $this->access_token)); 
    $response = curl_exec($ch); 

    if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) { 
     $response = json_decode($response); 
     throw new \Exception("CSV download was not successful: " + json_encode($response)); 
    } 

    $tmp = tmpfile(); 
    $path = stream_get_meta_data($tmp)['uri']; 
    file_put_contents($path, $response); 

    error_log('[' . $startTime->format('Y-m-d h:i:s') . '] Saved URL to ' . $path . ' ...'); 

    return $path; 
} 

// ... 

if (!$this->is_token_valid()) { 
    $this->get_access_token(); 
} 
$this->download_file(); 
相關問題