9

Tôi đang xây dựng một ứng dụng cho phép quản trị viên xác thực quyền truy cập vào tài khoản phân tích của họ để sử dụng ngoại tuyến và lưu trữ mã thông báo làm mới trong cơ sở dữ liệu.Làm cách nào để nhận mã thông báo truy cập được cập nhật, sử dụng mã thông báo làm mới được lưu trữ

Bây giờ khi tôi cố gắng sử dụng các API trên lối vào, nó sẽ trả về lỗi sau:

"Access Token Expired. There wan a general error : The OAuth 2.0 access token has expired, and a refresh token is not available. Refresh tokens are not returned for responses that were auto-approved." 

Dưới đây là mã của tôi mà tạo ra lỗi này cho đến nay:

require_once "lib/google/Google_Client.php"; 
require_once "lib/google/contrib/Google_AnalyticsService.php"; 

$_analytics = new analytics(); 
$_googleClient = new Google_Client(); 
$_googleClient->setClientId($_analytics->gaClientId); 
$_googleClient->setClientSecret($_analytics->gaClientSecret); 
$_googleClient->setRedirectUri($_analytics->gaRedirectUri); 
$_googleClient->setScopes($_analytics->gaScope); 
$_googleClient->setAccessType($_analytics->gaAccessType); 

// Returns last access token from the database (this works) 
$_tokenArray['access_token'] = $_analytics->dbAccessToken($_agencyId); 
$_googleClient->setAccessToken(json_encode($_tokenArray)); 

if($_googleClient->isAccessTokenExpired()) { 
    // Don't think this is required for Analytics API V3 
    //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId)); 
    echo 'Access Token Expired'; // Debug 
} 

if (!$_googleClient->getAccessToken()) { 
    echo '<h2>Error - Admin has not setup analytics correct yet</h2>'; 
} 

tôi sau một hàm để chạy một cái gì đó như setRefreshToken - nhập giá trị từ cơ sở dữ liệu, từ quản trị viên trước đó xác thực nó trực tuyến.

Trả lời

7

Bạn có thể thử như sau, bạn sẽ cần phải thêm vào mã để lưu mã thông báo mới trong cơ sở dữ liệu của bạn.

if($_googleClient->isAccessTokenExpired()) { 
    // Don't think this is required for Analytics API V3 
    //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId)); 
    echo 'Access Token Expired'; // Debug 

    $_googleClient->authenticate(); 
    $NewAccessToken = json_decode($_googleClient->getAccessToken()); 
    $_googleClient->refreshToken($NewAccessToken->refresh_token); 
} 
+1

đó cố định nó, cộng với tôi đã cố gắng để làm mới thẻ bằng cách sử dụng truy cập t oken, thay vì sử dụng mã thông báo làm mới làm thông số. #fail - cảm ơn! – mattpark22

+1

Một trong hai bạn có biết cách tôi có thể buộc mã thông báo truy cập hết hạn để kiểm tra bằng cách sử dụng chức năng mã thông báo làm mới để nhận mã thông báo truy cập mới không? @mpark – Anagio

+1

@Anagio bạn sẽ có thể chạy '$ _googleClient-> refreshToken ($ NewAccessToken-> refresh_token); ' để buộc một mã thông báo mới. Sau đó, chỉ cần so sánh mã thông báo cũ với mã thông báo mới để xem mã thông báo đã thay đổi chưa. –

0

Sử dụng thử/nắm bắt và sử dụng bắt để chuyển hướng/làm mới mã thông báo truy cập. Dưới đây là giải pháp tôi sử dụng cho vấn đề tương tự:

$plus = new Google_Service_Plus($client); 
try { 
$me = $plus->people->get('me'); 
} catch(Exception $e){ 
     if(!(strpos($_SERVER["REQUEST_URI"],'logout'))){ 
     if (isset($authUrl)){ 
       $redirect = $authUrl; 
     } 
     else{ 
        $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] .'?logout'; 
     } 
     header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); 
     exit; 
} 

Bạn có thể thay thế báo cáo kết quả dưới thử với dòng ném ngoại lệ, tôi đoán đó sẽ là

$_googleClient->setClientId($_analytics->gaClientId); 

hoặc bạn cũng có thể thử làm mới token theo giải pháp đưa ra ở đây:

https://stackoverflow.com/a/22096740/1675384