2014-11-02 212 views
1

我寫了一個腳本,成功地向谷歌查詢使用PHP SDK的訪問令牌。谷歌API刷新令牌

我的代碼,

require_once('_/libs/google/apiclient/autoload.php'); 

$client_id = '<MY_ID>'; 
$client_secret = '<MY_SECRET>'; 
$redirect_uri = '<REDIRECT_URL>'; 

// Config my apps information 
$client = new Google_Client(); 
$client->setClientId($client_id); 
$client->setClientSecret($client_secret); 
$client->setRedirectUri($redirect_uri); 
$client->addScope("https://mail.google.com/"); 

// When google redirects with code swap for access token 
if (isset($_GET['code'])) { 
    $client->authenticate($_GET['code']); 

    <------------- Try to get both tokens -----------------> 
    $_SESSION['access_token'] = $client->getAccessToken(); 
    $_SESSION['refresh_token'] = $client->getRefreshToken(); 


    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); 
} 

一旦我得到了驗證碼如上和查詢顯示了訪問令牌通過getAccessToken();它的創建和到期時間返回。

但是,當我通過getRefreshToken();查詢刷新令牌時,它在輸出到屏幕時不會返回任何內容。

也有類似的問題問here

的問題似乎讓谷歌知道你需要離線訪問然而回答這個問題是不可轉讓的PHP SDK。

回答

1

儘管我使用的是JavaScript,但我剛剛經歷了這個完全相同的問題。我通過將redirect_uri參數添加到初始令牌請求調用來解決此問題。

這是我的SO後,我的解決方案:Google API - Oauth 2.0 Auth token flow

爲了澄清流,讓你確實有提出請求獲得來自谷歌一個「代碼」刷新令牌(因此我的參數'response_type': 'code')然後用該代碼再次調用以獲取訪問令牌和刷新令牌。