2012-04-05 23 views
19

मैंने अपने नए एप्लिकेशन पर Google कैलेंडर कॉन्फ़िगर करना शुरू कर दिया। मैं लगभग गूगल डेवलपर्स (https://developers.google.com/google-apps/calendar/instantiate) में प्रदर्शित प्रमाणीकरण कोड का एक सटीक प्रतिलिपि बना है, लेकिन मैं निम्नलिखित त्रुटि मिलती रहती है:Google पर प्रमाणीकरण: OAuth2 'invalid_grant' को वापस रखता है

लाने में त्रुटि हुई OAuth2 पहुँच टोकन, संदेश: 'invalid_grant'

मैं वर्तमान में उपयोग कर रहा हूँ फोर्क-सीएमएस (http://www.fork-cms.com), एक युवा lightweigth सीएमएस। मैंने google-api-php-client की config.php फ़ाइल को सही तरीके से कॉन्फ़िगर किया है। (क्लाइंट-आईडी, क्लाइंट-राइट, रीडायरेक्ट-यूरी, डेवलपमेंट की, ...) और रीडायरेक्ट यूरी Google एपीआई कंसोल पर सही ढंग से सेट है। मेरे कोड इस प्रकार दिखता है:

<?php 

/** 
* This is a widget with a calendar implementation. 
* 
* @package  frontend 
* @subpackage events 
* 
* @author  Michiel Vlaminck <[email protected]> 
*/ 
class FrontendEventsWidgetCalendar extends FrontendBaseWidget 
{ 

    private $events = array(); 
    private $authUrl = array(); 

    /** 
    * Execute the extra 
    * 
    * @return void 
    */ 
    public function execute() 
    {  
     // call parent 
     parent::execute(); 

     // load template 
     $this->loadTemplate(); 

     // get data 
     $this->getData(); 

     // parse 
     $this->parse(); 
    } 


    /** 
    * Get the data from Google Calendar 
    * This method is only executed if the template isn't cached 
    * 
    * @return void 
    */ 
    private function getData() 
    { 
     require_once PATH_LIBRARY . '/external/google-api-php-client/src/apiClient.php'; 
     require_once PATH_LIBRARY . '/external/google-api-php-client/src/contrib/apiCalendarService.php'; 

     $client = new apiClient(); 

     $service = new apiCalendarService($client); 

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

     if ($client->getAccessToken()) { 

      $calId = FrontendEventsModel::getCalendarId((int) $this->data['id']); 
      $calId = $calId[0]['calendar_id']; 

      $events = $service->events->listEvents($calId); 
      $this->events = $events['items']; 

      $_SESSION['oauth_access_token'] = $client->getAccessToken(); 

     } else { 
      $this->authUrl = $client->createAuthUrl(); 
     } 
    } 


    /** 
    * Parse 
    * 
    * @return void 
    */ 
    private function parse() 
    { 
     $this->tpl->assign('events', $this->events); 
     $this->tpl->assign('authUrl', $this->authUrl); 
    } 
} 

?> 

जब मैं पहली बार के लिए इस विजेट-पेज खोलते हैं, तो मैं आवेदन को प्रमाणित करने के गूगल को निर्देश मिलता है। जब मैं इस बात से सहमत है, मैं अपने आवेदन करने के लिए रीडायरेक्ट और उस समय मैं कहाँ हो रही है है:

apiAuthException » Main 

Message Error fetching OAuth2 access token, message: 'invalid_grant' 
File C:\wamp\www\Officevibes\library/external\google-api-php-client\src\auth\apiOAuth2.php 
Line 105 
Date Thu, 05 Apr 2012 08:34:47 +0000 
URL http://localhost/calendar?code=4/YPUpFklKvhEeTcMm4moRth3x49oe 
Referring URL (Unknown) 
Request Method GET 
User-agent Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19 
+1

इसे अब रद्द करने के बजाय "अपने ग्राहक रहस्य को रीसेट करें" कहा जाता है। – jenlampton

+0

मेरे मामले में मैं पहले कंसोल पी 12 कुंजी फ़ाइल से हटा दिया गया था ... – yergo

उत्तर

22

आप पहुँच पुनः उपयोग करना चाहिए टोकन आप पहली बार सफल प्रमाणीकरण के बाद मिलता है। यदि आपका पिछला टोकन अभी तक समाप्त नहीं हुआ है तो आपको invalid_grant त्रुटि मिलेगी। इसे कहीं कैश करें ताकि आप इसका पुन: उपयोग कर सकें।

+7

मुझे लगता है कि यह अब सत्य नहीं है। रीफ्रेश टोकन का उपयोग करके, मैं एक्सेस टोकन प्राप्त करने में सक्षम था, और फिर पहले की समाप्ति से पहले एक और। (मुझे लगता है कि यह ओएथ 2.0 प्लेग्राउंड में भी देखा जा सकता है - https://developers.google.com/oauthplayground/)। – user637563

+0

असल में .. मैं अधिक access_tokens उत्पन्न करने के लिए refresh_token का उपयोग करने में सक्षम हूं भले ही वर्तमान की अवधि समाप्त हो गई हो। यह सिर्फ मुझे एक नया access_token दे देगा, और पिछला अभी भी वैध है। तो ... मुझे यकीन नहीं है कि आप जो कह रहे हैं वह सटीक है। – omarojo

+0

यह बहुत अच्छा हो सकता है। मैंने फिर से अपने अनुभव के आधार पर सचमुच उत्तर दिया। यह इंटरनेट समय में एक प्राचीन जवाब है। इस बीच चीजें बदल सकती हैं। – janmoesen

8
अपने Google API कंसोल ( https://code.google.com/apis/console/) को

जाओ और स्थापित अनुप्रयोगों के लिए के तहत ग्राहक आईडी आपका क्लाइंट सीक्रेट को निरस्त करें।

भी नए क्लाइंट सीक्रेट

9

मैं एक ऐसी ही अपने सर्वर गलत किया जा रहा है पर समय की वजह से समस्या हो रही थी साथ अपना कोड अपडेट करना सुनिश्चित करें। सुनिश्चित करें कि आपकी सिस्टम घड़ी सिंक्रनाइज़ है।

+0

यह है !!!!! – kizzx2

+0

यह मेरी समस्या भी थी। मैं एपीआई चलाने के लिए वर्चुअल मशीन का उपयोग कर रहा हूं। जागने के बाद सीधे समय अभी तक synchornized नहीं है। – Rias

+1

मैंने कई समाधानों की कोशिश की है।यह आखिरी समाधान है जिसे मैंने कोशिश की क्योंकि मैं समझ नहीं पा रहा हूं। "सर्वर पर गलत होने पर" आपका क्या मतलब है? सिस्टम घड़ी को समेकित किया गया है या नहीं? – John

3
  1. जाओ security.google.com को
  2. पहुंच निरस्त करें
  3. यात्रा प्रमाणीकरण यूआरएल फिर
  4. आप अब एक नया refreshtoken
1

आप भी इस त्रुटि अगर प्राप्त करेंगे मिल जाएगा आप गलती से अपने आईडी टोकन को अपने एक्सेस टोकन के बजाय प्रमाणीकृत करने का प्रयास करते हैं।

तो मेरे जैसा मत बनो - सुनिश्चित करें कि आप अपने कोड में सही टोकन पास करते हैं!

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