9

管理者がオフラインで使用するために分析アカウントへのアクセスを認証し、更新トークンをデータベースに保存できるようにするアプリケーションを構築しています。

フロントエンドで API を使用しようとすると、次のエラーが返されます。

"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."

これまでにこのエラーを生成するコードは次のとおりです。

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

私は setRefreshToken のようなものを実行する関数を求めています - 以前にオンラインで認証した管理者から、データベースから値を入力します。

4

2 に答える 2

7

以下を試すことができます。新しいトークンをデータベースに保存するコードを追加する必要があります。

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);
}
于 2013-04-03T00:07:56.693 に答える
0

try/catch を使用し、アクセス トークンのリダイレクト/更新には catch を使用します。以下は、同様の問題に使用したソリューションです。

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

try の下のステートメントを、例外をスローする行に置き換えることができます。

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

または、次の解決策に従ってトークンを更新することもできます。

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

于 2014-10-01T08:06:00.763 に答える