1

ユーザーが自分の Google カレンダーを持ちたいサイトがあります。すべての例で、カレンダーの所有者が毎回認証されているようです。ユーザーのカレンダー データを取得して表示するためにアプリを認証する方法はありませんか?

access_token彼らが私のアプリを受け入れた後、所有者のファイルを保存しようとしましたが、しばらくすると次のエラーが発生しました:

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.

これは私が試しているコードです(ところで、config.phpにはすべてのAPIが記入されています)

$client = new Google_Client();
$client->setUseObjects(true); 
$client->setApplicationName("My Unit Calendar");
$client->setAccessType('offline');
$client->setAccessToken($row['access_token'] ); //from the DB

$calService = new Google_CalendarService($client);

$events = $calService->events->listEvents( $row['google_cal_id'] ); //from the DB

echo "events--><pre>".print_r($events,true)."</pre>";

しかし、次の例外が発生します。

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

助けてくれてありがとう

4

1 に答える 1

1

Google から何かを取得/設定する前に、アクセス トークンの有効期限が切れていないかどうかを確認し、更新トークンを使用して更新する必要があります。最初の承認後に取得しました (によって返され$client->getAccessToken()ます)。次のようなことをしたいと思います。

$client = new Google_Client();
$client->setUseObjects(true); 
$client->setApplicationName("My Unit Calendar");
$client->setAccessType('offline');
$client->setAccessToken($row['access_token'] ); //from the DB

$calService = new Google_CalendarService($client);

checkToken($client, $row['refresh_token']); // Added function

$events = $calService->events->listEvents( $row['google_cal_id'] );

// Check if Access token is expired and get new one using Refresh token
function checkToken($client) {
    if($client->isAccessTokenExpired()) {
        $client->refreshToken( $refresh_token );
    }
}

最初に承認されたときに取得したデータベース更新トークンに保存し、アクセストークンが期限切れになっていないかどうかを確認する必要があります。期限切れの場合は更新します (たとえば、google_callback.phpファイル内)。

// Initialize access to Google
$client = new Google_Client();
$client->setClientId( *** );
$client->setClientSecret( *** );
$client->setRedirectUri( *** );
$client->setAccessType( *** );

// Initialize access to Calendar as service
$service = new Google_CalendarService($client);

// If isset code - set into session
if (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
    $_SESSION['google-api']['access_token'] = $client->getAccessToken();
    header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}


// If in session is set token
if (isset($_SESSION['google-api']['access_token'])) {
    $client->setAccessToken($_SESSION['google-api']['access_token']);
}


// If Access Token Expired (uses Google_OAuth2 class), refresh access token by refresh token
if($client->isAccessTokenExpired()) {
    $client->refreshToken( /* Get refresh token from DB */);
}


// If client got access token successfuly - perform operations
$access_tokens = json_decode($client->getAccessToken());

if ($access_tokens) {
    // Update refreshToken and save data if refresh token is received (logged in now)
    if(isset($access_tokens->refresh_token)) {
        // Store in DB refresh token - $access_tokens->refresh_token
    }
}
于 2013-05-27T11:49:17.127 に答える