2013-08-27 11 views
6

Google API के साथ मेरा दर्द जारी है ...ताज़ा टोकन

मैं एक ताज़ा टोकन का उपयोग करने के लिए एक स्क्रिप्ट का उपयोग करने में सक्षम हूँ। मैं कैलेंडर के साथ बातचीत कर सकता हूं और सब अच्छा है।

अब मैं php के लिए google api क्लाइंट का उपयोग करने के लिए आगे बढ़ना चाहता हूं और कल यह काम कर रहा था, जबकि मेरा टोकन वैध था, लेकिन अब यह समाप्त हो गया है, मैं नया काम करने के लिए रीफ्रेश टोकन का उपयोग कैसे कर सकता हूं टोकन और भविष्य में समाप्त होने के बाद प्रमाणीकरण जारी रखने के लिए।

मैं अनेक संदर्भ उपस्थित पाया जाता है और इन की कोशिश की है - यहाँ अपने परीक्षण स्क्रिप्ट अब तक simple.php उदाहरण के आधार पर दिया गया है:

<?php 
require_once '../../src/Google_Client.php'; 
require_once '../../src/contrib/Google_CalendarService.php'; 
session_start(); 

$client = new Google_Client(); 
$client->setAccessType('offline'); 
$client->setApplicationName("Downs Golfmanager"); 


// Visit https://code.google.com/apis/console?api=calendar to generate your 
// client id, client secret, and to register your redirect uri. 
$client->setClientId('XXXXXX.apps.googleusercontent.com'); 
$client->setClientSecret('XXXXXX'); 
$client->setRedirectUri('XXXXXX'); 
$client->setDeveloperKey('XXXXXX'); 
$client->refreshToken('X/XXXXX'); 


$client->setUseObjects(true); 
$cal = new Google_CalendarService($client); 
if (isset($_GET['logout'])) { 
    unset($_SESSION['token']); 
} 

if (isset($_GET['code'])) { 
    $client->authenticate($_GET['code']); 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); 
} 

if (isset($_SESSION['token'])) { 
    $client->setAccessToken($_SESSION['token']); 
} 

if($client->isAccessTokenExpired()) { 
    /
    echo 'Access Token Expired'; // Debug 
    //$client->refreshToken($refreshToken); 
} 

if ($client->getAccessToken()) { 

    $event = new Google_Event(); 

    $event->setSummary('Appointment'); 
    $event->setLocation('Somewhere'); 

    $start = new Google_EventDateTime(); 
    $start->setDateTime('2013-08-28T14:00:00.000+01:00'); 
    $event->setStart($start); 

    $end = new Google_EventDateTime(); 
    $end->setDateTime('2013-08-28T15:25:00.000+01:00'); 
    $event->setEnd($end); 

    $createdEvent = $cal->events->insert('[email protected]', $event); 

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


    //test pulling events 
    $events = $cal->events->listEvents('[email protected]'); 

    while(true) { 
     foreach ($events->getItems() as $event) { 
     echo $event->getSummary(); 
     } 
     $pageToken = $events->getNextPageToken(); 
     if ($pageToken) { 
     $optParams = array(
      'pageToken' => $pageToken, 
      'timeMin'=>'2013-08-26T00:00:00+01:00', 
      'timeMax'=>'2013-08-31T00:00:00+01:00' 
      ); 
     $events = $cal->events->listEvents('[email protected]', $optParams); 
     } else { 
     break; 
     } 
    } 
    //print "<h1>Events List</h1><pre>" . print_r($events, true) . "</pre>"; 



    $calList = $cal->calendarList->listCalendarList(); 
    print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>"; 


$_SESSION['token'] = $client->getAccessToken(); 
} else { 
    $authUrl = $client->createAuthUrl(); 
    print "<a class='login' href='$authUrl'>Connect Me!</a>"; 
} 

मेरे पिछले पोस्ट के साथ के रूप में मैं स्पष्ट नहीं कर रहा हूँ क्या होना चाहिए यहाँ जा रहा है मेरा टोकन समाप्त हो गया है - मेरे पास रीफ्रेश टोकन है। मेरे कोड में क्या परिवर्तन होता है जब मुझे प्रत्येक बार एक्सेस करने के लिए प्राधिकरण को स्वचालित रूप से रीफ्रेश करने की आवश्यकता होती है।

संपादित करें: त्रुटि कोड है: The OAuth 2.0 access token has expired, and a refresh token is not available

मैं हल करने के लिए अतिरिक्त लाइनें जो ऊपर मैं अपने प्रयास में शामिल था की एक जोड़ी बाहर टिप्पणी की है तो बस कोशिश करते हैं और से बचने के लिए भ्रामक आगे

धन्यवाद

उत्तर

10

ठीक है - कुछ पोस्टों के आधार पर मैंने एक नया एक्सेस टोकन प्राप्त करने के लिए रीफ्रेश टोकन प्राप्त करने की समस्या को ठीक कर दिया है।

if($client->isAccessTokenExpired()) { 
    echo 'Access Token Expired'; // Debug 
    $client->refreshToken('X/XXXXXX'); 
} 

कहाँ refreshToken में भाग बाहर blanked मेरी ताज़ा टोकन है: इससे पहले कि मैं किसी भी उपयोग प्रयास करने के लिए शुरू कर दिया मैं इस कोड का इस्तेमाल किया। मैंने कोड में कुंजी को कड़ी मेहनत की।

यह संभवतः सही समाधान नहीं है क्योंकि मैंने डेटाबेस में कुंजी संग्रहीत करने के संदर्भ देखे हैं, इसलिए संभवतः मैं रीफ्रेश टोकन के साथ एक डीबी में वर्तमान एक्सेस टोकन स्टोर कर सकता हूं और इन फॉर्म को डीबी के रूप में खींच सकता हूं हार्ड कोडिंग उन्हें बचाने के लिए आवश्यक है?

उम्मीद है कि मैंने जिस विधि का उपयोग किया है, वह समाप्त होने के बाद फिर से काम करेगा - उंगलियों को पार कर गया!

+1

क्या आप जानते हैं कि मैं एक एक्सेस टोकन को समाप्त करने के लिए मजबूर कर सकता हूं ताकि मैं रीफ्रेश टोकन के साथ एक नए एक्सेस टोकन का अनुरोध कर सकूं? – Anagio

+0

मुझे लगता है (लेकिन 100% नहीं) वे 3600ms वैसे भी थोड़े समय के होते हैं? मैंने उस पर स्लीओइंग करके रीफ्रेश का परीक्षण किया :) मुझे लगता है कि मेनमोरी से आप कॉल में पैरामीटर में टोकन का जीवन निर्दिष्ट कर सकते हैं। मुझे ओथ प्लेग्राउंड – Ray

+0

के साथ खेलने से उपयोगी जानकारी मिली है, धन्यवाद, मुझे यह पता चला, जब यह समाप्त हो गया तो मुझे उलझन में आया और मुझे अभी भी डेटा मिल रहा था, मेरे कोड में यह जांचने की कोई शर्त नहीं थी कि एक्सेस टोकन समाप्त हो गया है या नहीं, रीफ्रेश टोकन का उपयोग करके एक नया प्राप्त करने के लिए। आपके कोड ने मदद की, मुझे यह काम मिल गया। – Anagio

संबंधित मुद्दे