2013-01-14 27 views
8

Tôi đã tìm kiếm gần như mọi kết quả của trang đầu tiên của google cho điều này. Nhưng dường như không thể tìm ra câu trả lời. Tôi đang làm việc với API refresh_token của API Google và nhận:Mã thông báo làm mới của Google-api-php trả về invalid_grant

Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" } 

Tôi đang làm gì. Thứ nhất: Tôi đang tạo ra và lưu trữ kết nối persistant để google api:

$client = new Google_Client(); 
$client->setClientId('xxxxxx-s73q0pa41aq3i2kcpatmpas6e6kkp99h.apps.googleusercontent.com'); 
$client->setClientSecret('xxxxxxxxxxxx'); 
$client->setRedirectUri('http://xxxxxxxx/generaterefreshtoken.php'); 
$client->setScopes(array('https://www.googleapis.com/auth/drive')); 
$client->setAccessType('offline'); 


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

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

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

if ($client->getAccessToken()) { 

    $jsonarray = json_decode($client->getAccessToken()); 
    $arrGoogleAuth['access_token']=$jsonarray->access_token; 
    $arrGoogleAuth['refresh_token']=$jsonarray->refresh_token; 
    //filewrite 

    $myFile = "refreshtoken.conf"; 
    $fh = fopen($myFile, 'w') or die("can't open file"); 
    fwrite($fh, $client->getAccessToken()); 
    fclose($fh); 


    /* 

    die(); 

    $service = new Google_DriveService($client); 
    $file = new Google_DriveFile(); 
    $file->setTitle('My document.txt'); 
    $file->setDescription('A test document'); 
    $file->setMimeType('text/plain'); 

    $data = file_get_contents('document.txt'); 

    $createdFile = $service->files->insert($file, array(
      'data' => $data, 
      'mimeType' => 'text/plain', 
     )); 

    print_r($createdFile); 
*/ 



    // The access token may have been updated lazily. 
    $_SESSION['token'] = $client->getAccessToken(); 
} else { 
    $auth = $client->createAuthUrl(); 
    header("Location: $auth"); 
} 

tất cả mọi thứ chạy Vì vậy, về cơ bản và token được lưu trữ trong một textfile:

{ 
"access_token":"xxxxxxxxxxxxxxxN4U0ys2wy5monxs0Xh5fu5ayKL0OIENo-d1sN6g3YA", 
"token_type":"Bearer", 
"expires_in":3600, 
"refresh_token":"xxxxxxxxxxxxDON-l90BNUcJgnkfZWDfg", 
"created":1358120143 
} 

Khi tôi đang cố gắng để auth sử dụng đoạn mã sau:

$client = new Google_Client(); 
$client->setClientId($googleDriveConfig['clientid']); 
$client->setClientSecret($googleDriveConfig['clientsecret']); 
$client->setRedirectUri(curPageURL); 
$client->setScopes(array('https://www.googleapis.com/auth/drive')); 
$client->refreshToken(file_get_contents('../_config/refreshtoken.conf')); 
$client->authenticate(); 

tôi nhận được lỗi sau: lỗi khi làm mới token OAuth2, thông điệp: '{ "lỗi": "invalid_grant"}

Trả lời

-4

Trước Authenticate, phải có cái gì đó như:

$client->grantType("refresh_token") 
+0

grantType không phải là một chức năng trên Google_Client, có chức năng refreshToken, nhưng nó không hoạt động. – Mikushi

+0

Tại sao điều này được chọn là chính xác nếu grantType không phải là một hàm thực sự bên trong lớp Google_Client? – EHerman

+0

Đối với bất kỳ ai khác muốn làm mới mã thông báo truy cập của họ bằng cách sử dụng mã thông báo làm mới, bạn có thể thực hiện '' '$ client-> refreshToken ($ refresh_token); $ _SESSION ['token'] = $ client-> getAccessToken(); '' 'Bạn sẽ nhận được invalid_grant trả về nếu bạn đang cố gắng làm mới một cái gì đó khác với mã thông báo làm mới được cấp gần đây nhất của bạn. – EHerman

3

Invalid_grant nghĩa là mã ủy quyền đã được sử dụng (có sẵn trong $GET['code']) hoặc loại ứng dụng được định cấu hình trong Bảng điều khiển API Google không hợp lệ.

Đảm bảo bạn chọn "Ứng dụng web" khi đăng ký ứng dụng của mình trong Bảng điều khiển API Google.

6

Bạn sẽ nhận được một lỗi "invalid_grant" nếu bạn cố gắng làm mới khi thẻ chưa hết hạn.

Thay vì điều này:

$client->refreshToken(file_get_contents('../_config/refreshtoken.conf')); 

Sử dụng này:

$client->setAccessToken(file_get_contents('../_config/refreshtoken.conf')); 

Khi thẻ của bạn hết hạn bạn làm mới nên làm việc.

0

Chức năng hoạt động cho tôi như sau

$ client-> setAccessType ("refresh_token");

0

Tôi chạy vào một cái gì đó tương tự và vấn đề đối với tôi là đồng hồ hệ thống của tôi (bên trong máy ảo Docker nơi tôi đang chạy mã) không được đồng bộ hóa với thời gian thực. Vì vậy, bạn đang yêu cầu mã thông báo có ngày được tạo quá xa trong quá khứ hoặc trong tương lai mà OAuth đang từ chối.

Tôi đã được trích dẫn bởi báo cáo here.