SORU
11 ŞUBAT 2012, CUMARTESİ


Nasıl Google API istemci ile token yenilemek için?

Etrafında Google Analytics API (V3) ile oynuyorum ve som hataları var. Öncelikle, her şeyi doğru kurmak ve test Hesabım ile çalıştı. Ama başka bir profil KİMLİĞİ veri kapmak istiyorum (/GA Hesabı Aynı Google Accont) 403 Hatası alıyorum. Garip olan şey bazı GA hesaplarından veri iken başka bu hata döndürecektir.

Token ve kimliği doğrulanmış bir kez daha iptal ettim, ve şimdi tüm hesaplarımdaki veri kapmak gibi görünüyor. Sorun çözüldü mü? Değil. Erişim anahtarı dolacak gibi, aynı sorunla tekrar edeceğim.

Eğer doğru şeyler anladım, yeni bir authenticationTooken almak için resfreshToken kullanabilirsiniz.

Sorun çalıştırdığımda,:

$client->refreshToken(refresh_token_key) 

aşağıdaki hata döndürülür:

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

RefreshToken yöntemi arkasındaki kod kontrol ettim ve istek “” dosya. apioauth2.php takip geri Tüm parametreler doğru gönderilir. Bu grant_type zor ‘refresh_token’ yöntemi içinde, bana ters. ne anlamak zor kodlanmıştır Parametre dizi bu gibi görünüyor:

Array ( [client_id] => *******-uqgau8uo1l96bd09eurdub26c9ftr2io.apps.googleusercontent.com [client_secret] => ******** [refresh_token] => 1\/lov250YQTMCC9LRQbE6yMv-FiX_Offo79UXimV8kvwY [grant_type] => refresh_token )

Yordam aşağıdaki gibidir.

$client = new apiClient();
$client->setClientId($config['oauth2_client_id']);
$client->setClientSecret($config['oauth2_client_secret']);
$client->setRedirectUri($config['oauth2_redirect_uri']);
$client->setScopes('https://www.googleapis.com/auth/analytics.readonly');
$client->setState('offline');

$client->setAccessToken($config['token']); // The access JSON object.

$client->refreshToken($config['refreshToken']); // Will return error here

Bu bir hata değildir, ya da ben tamamen yanlış anlaşılan bir şey var mı?

CEVAP
13 Mart 2013, ÇARŞAMBA


Sonunda bunu yapmak için nasıl düşündüm. Temel fikir, kimlik doğrulama için ilk sorduğun zaman belirteci olması. Bu ilk token yenileme simge vardır. Bir saat sonra ilk orijinal token sona eriyor. Bir saat sonra yenile yeni bir kullanılabilir token almak, token, token kullanmak zorunda. $client->refreshToken($refreshToken) yeni bir jeton almak için kullanın. Bu "temp göstergesi." diyeceğim Bu geçici olarak çünkü bitiminden bir saat sonra token saklamak ve yenileme token bir ilgili yok dikkat etmek gerekir. Yeni bir temp token almak için kullandığınız yöntem kullanmadan önce ve ilk belirtecini refreshtoken kullanmanız gerekir. Çirkin, ama bu im yeni olan aşağıda kodu ekledim,...

//pull token from database
$tokenquery="SELECT * FROM token WHERE type='original'";
$tokenresult = mysqli_query($cxn,$tokenquery);
if($tokenresult!=0)
{
    $tokenrow=mysqli_fetch_array($tokenresult);
    extract($tokenrow);
}
$time_created = json_decode($token)->created;
$t=time();
$timediff=$t-$time_created;
echo $timediff."<br>";
$refreshToken= json_decode($token)->refresh_token;


//start google client note:
$client = new Google_Client();
$client->setApplicationName('');
$client->setScopes(array());
$client->setClientId('');
$client->setClientSecret('');
$client->setRedirectUri('');
$client->setAccessType('offline');
$client->setDeveloperKey('');

//resets token if expired
if(($timediff>3600)&&($token!=''))
{
    echo $refreshToken."</br>";
    $refreshquery="SELECT * FROM token WHERE type='refresh'";
    $refreshresult = mysqli_query($cxn,$refreshquery);
    //if a refresh token is in there...
    if($refreshresult!=0)
    {
        $refreshrow=mysqli_fetch_array($refreshresult);
        extract($refreshrow);
        $refresh_created = json_decode($token)->created;
        $refreshtimediff=$t-$refresh_created;
        echo "Refresh Time Diff: ".$refreshtimediff."</br>";
        //if refresh token is expired
        if($refreshtimediff>3600)
        {
            $client->refreshToken($refreshToken);
        $newtoken=$client->getAccessToken();
        echo $newtoken."</br>";
        $tokenupdate="UPDATE token SET token='$newtoken' WHERE type='refresh'";
        mysqli_query($cxn,$tokenupdate);
        $token=$newtoken;
        echo "refreshed again";
        }
        //if the refresh token hasn't expired, set token as the refresh token
        else
        {
        $client->setAccessToken($token);
           echo "use refreshed token but not time yet";
        }
    }
    //if a refresh token isn't in there...
    else
    {
        $client->refreshToken($refreshToken);
        $newtoken=$client->getAccessToken();
        echo $newtoken."</br>";
        $tokenupdate="INSERT INTO token (type,token) VALUES ('refresh','$newtoken')";
        mysqli_query($cxn,$tokenupdate);
        $token=$newtoken;
        echo "refreshed for first time";
    }      
}

//if token is still good.
if(($timediff<3600)&&($token!=''))
{
    $client->setAccessToken($token);
}

$service = new Google_DfareportingService($client);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • metal571

    metal571

    30 Mayıs 2006
  • schmittastic

    schmittastic

    9 EYLÜL 2009
  • Tomas N

    Tomas N

    14 Kasım 2010