0

アカウント情報を取得するためにGoogleアナリティクスAPI(PHP)を使用していますが、以下を使用してrefrechトークンを取得しました。

if (isset($_SESSION['token'])) {

// echo $_SESSION['token'].'<br />';

$authObj = json_decode($_SESSION['token']);
$accessToken = $authObj->access_token;
$refreshToken = $authObj->refresh_token;
$tokenType = $authObj->token_type;
$expiresIn = $authObj->expires_in;

echo 'access_token = ' . $accessToken;
echo '<br />';
echo 'refresh_token = ' . $refreshToken;
echo '<br />';
echo 'token_type = ' . $tokenType;
echo '<br />';
echo 'expires_in = ' . $expiresIn;
echo '<br />';
}

その後、によって返された値をコピーし$refreshToken、前の関数にコメントを付けて、次のようにメソッドを呼び出します。

$refreshToken  = '1/YZiV9J********vMjey8*****************';
$client->refreshToken($refreshToken);

これは完璧に機能しますが、アクセストークンが期限切れになったことを通知する1時間後のエラーが発生します。

アクセストークンの有効期限が切れていることをどのように知ることができますか。この投稿を見つけました。男は問題を解決しましたが、回答を投稿しませんでした。また、ターミナルを介してコードを実行しているため、認証プロセスを再度実行せずに、同じrefrechトークンを使用して新しいトークンを生成するにはどうすればよいですか。

プロジェクトの抜粋を以下に投稿しました。

ありがとう!

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_AnalyticsService.php';
$scriptUri = 'http://domainname.com';

session_start();

$client = new Google_Client();
$client->setApplicationName('Google Analytics project');

$client->setClientId('************.apps.googleusercontent.com');
$client->setClientSecret('S**********************1T');

$client->setRedirectUri($scriptUri);

$client->setDeveloperKey('**************************-1c');
$client->setScopes(array('https://www.googleapis.com/auth/analytics.readonly'));

$client->setAccessType('offline'); 
$client->setUseObjects(true);


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'])) {    
$authObj = json_decode($_SESSION['token']);
$accessToken = $authObj->access_token;
$refreshToken = $authObj->refresh_token;
$tokenType = $authObj->token_type;
$expiresIn = $authObj->expires_in;
}


if (!$client->getAccessToken()) {  

$authUrl = $client->createAuthUrl();  
print "<a class='login' href='$authUrl'>Connect Me!</a>";
} else {  
// Create analytics service object. See next step below.
$analytics = new Google_AnalyticsService($client);
runMainDemo($analytics);
}




function runMainDemo(&$analytics) {  

try {    
// Step 2. Get the user's first profile ID.    
$profileId = getProfileId($analytics);    
if (isset($profileId)) {      
    // Step 3. Query the Core Reporting API.      
    $results = getResults($analytics, $profileId);      
    // Step 4. Output the results.      
    printResults($results);    
    }  
} 
catch (apiServiceException $e) {    
// Error from the API.    
print 'There was an API error : ' . $e->getCode() . ' : ' . $e->getMessage();  
} 
catch (Exception $e) {    
print 'There wan a general error : ' . $e->getMessage();  
}
}



function getProfileId(&$analytics) {
    //My code to retrieve data
}
4

2 に答える 2

3

応答には、トークンの有効期間が含まれています。したがって、有効期限を保存し、リクエストを行う前に確認するのはあなた次第です。

擬似コード:

$expiry = getDate().now + $expires_in;
//later
if(getDate().now > $expiry) {
   //our token is expired. get a new one
} 

ローカルでの認証プロセスの再実行を回避する唯一の方法は、サーバー プロキシに認証リクエストを送信させ、結果をクライアントに返すことです。リクエストをプロキシすることにより、基本的にどこかに webapp サーバー (heroku、engineyard、ec2、裏庭 w/e) があり、それにトークンのリクエストを送信します。次に、Google への認証リクエストを作成し、新しいトークンを取得して、その結果をユーザーに返します。

これの要点は、セキュリティ上の理由から定期的に再認証を強制することです. それをバイパスする方法があったとしても、それはあまり安全ではありません。

于 2012-11-25T22:46:53.610 に答える
-2

これが私の解決策でした!

function getProfileId(&$analytics) {
    
      for ($i=0;i<10;$i++){
           
             **My code to retrieve data**
             // I called the method 'refreshToken' as following

             $GLOBALS['client']->refreshToken($GLOBALS['refreshToken']); 
       }
}

$GLOBALS は外部変数を呼び出すためのものです。$GLOBALS の仕組みの詳細については、このリンクを確認してください。

そのため、ループを通過するたびに新しいアクセス トークンを生成するので、アクセス トークンが不足することはありません。

于 2012-11-27T15:20:08.767 に答える