2015-09-21 7 views
13

जब तक उपयोगकर्ता प्राधिकरण को रद्द नहीं करता तब तक Google क्लाइंट को स्थायी रूप से अधिकृत कैसे करें?Google एपीआई PHP ऑफ़लाइन एक्सेस, "अमान्य_ग्रेंट: कोड पहले से ही रिडीम किया गया था"

मैं Google कैलेंडर से कनेक्ट होने वाला ऐप बनाने की कोशिश कर रहा हूं। इसे PHP में चलाना है और इसलिए मैं Google द्वारा प्रदान किए गए Google API PHP क्लाइंट का उपयोग कर रहा हूं।

ऐप को ऑफ़लाइन पहुंच की आवश्यकता है, इसलिए यह तब काम करता है जब उपयोगकर्ता सत्र में नहीं होता है। ऐप का उद्देश्य उपयोगकर्ताओं को वेबसाइटों और सार्वजनिक रूप से अपने कैलेंडर को सार्वजनिक रूप से प्रबंधित और प्रदर्शित करने देना है।

मैंने सेवा विधि (क्लाइंट आईडी और क्लाइंट गुप्त के साथ) का उपयोग करके Google कंसोल में प्रमाण-पत्र बनाए हैं। Google API क्लाइंट का उपयोग करके मैंने उपयोगकर्ता से प्राधिकरण का भी अनुरोध किया। मैं एक नई ब्राउज़र विंडो खोलता हूं, उपयोगकर्ता अधिकृत करता है, Google द्वारा प्राधिकरण कोड वापस कर दिया जाता है। मैं यह कोड लेता हूं, इसे स्टोर करता हूं और क्लाइंट को अधिकृत करने के लिए इसका उपयोग करता हूं, जो Google कैलेंडर से सफलतापूर्वक कनेक्ट होता है और डेटा का आदान-प्रदान करता है।

अब, मुझे समझ में आया कि यह एक टोकन है जो समाप्त होने जा रहा है। जब तक कोई ऑफ़लाइन एक्सेस का उपयोग नहीं करता, जिसे मैंने सेट किया है। हालांकि, कुछ ही मिनट या उससे कम के बाद मैं हमेशा एक त्रुटि प्राप्त होगी:

$client = new \Google_Client(); 
$client->setApplicationName('My App'); 
$client->setScopes(array(\Google_Service_Calendar::CALENDAR)); 
$client->setClientId($this->google_client_id); 
$client->setClientSecret($this->google_client_secret); 
$client->setRedirectUri($this->google_client_redirect); 
$client->setAccessType('offline'); 

if ($code = $this->google_client_auth) { 

    try { 

     $client->authenticate($code); 

    } catch(\Exception $e) { 
      var_dump($e); 
    }  

} 

return new \Google_Service_Calendar($client); 

यह एक वर्ग के अंदर एक विधि है: Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.

इस कोड मैं ग्राहक कनेक्ट करने के लिए इस्तेमाल करते हैं।

क्लाइंट आईडी और क्लाइंट रहस्य ऐप सेटिंग्स में संग्रहीत हैं।

मैं उपयोगकर्ता द्वारा सेटिंग में लौटाए गए कोड को भी संग्रहीत कर रहा हूं, लेकिन मुझे लगता है कि यह वह जगह है जहां मैं इसे गलत कर रहा हूं? मैं एक लिंक को Google OAuth विंडो में एक अलग विधि में डाल रहा हूं (जो भी उपयोग करता है वही ग्राहक आईडी और गुप्त और ऑफलाइन विधि भी सेट करता है)। और प्राधिकरण प्राप्त करने के लिए काम कर रहा है। मैं कैलेंडर प्राप्त कर सकता हूं। यह लंबे समय तक नहीं टिकता है ...

उत्तर

24

तीन प्रकार के कोड हैं या टोकन Googles Authentcation सर्वर रिटर्न।

  1. प्रमाणीकरण कोड
  2. पहुँच टोकन
  3. टोकन ताज़ा करें।

प्रमाणीकरण कोड

एक उपयोगकर्ता Authentcation प्रपत्र पर क्लिक करता है और आपके आवेदन एक्सेस मिल जाती है। Google आपको एक प्रमाणीकरण कोड देता है। आपको यह कोड लेना चाहिए और इसे एक्सेस टोकन और रीफ्रेश टोकन के लिए एक्सचेंज करना चाहिए। यह कोड केवल तभी उपयोग किया जाता है जब आप इसे फिर से प्रयास करें और इसका उपयोग करें तो आपको एक त्रुटि संदेश मिलेगा।

invalid_grant: Code was already redeemed.

पहुँच टोकन

पहुँच टोकन एपीआई इस टोकन हर अनुरोध बनाने के साथ-साथ भेजा जाना चाहिए तक पहुँचने के लिए उपयोग किया जाता है।पहुँच टोकन अल्पकालिक कर रहे हैं वे एक घंटे के लिए काम करते हैं और फिर वे

ताज़ा टोकन चाहिए काम बंद

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

आपकी समस्या यह है कि आप प्रमाणीकरण कोड को सहेज रहे हैं जो आपके लिए उपयोग नहीं है। आपको रीफ्रेश टोकन ढूंढना होगा और उसे सहेजना होगा।

+0

धन्यवाद ... लेकिन मुझे एक्सेस टोकन और तुरंत रीफ्रेश टोकन दोनों की आवश्यकता क्यों है? एपीआई में दो विधियां हैं IccessToken और getRefreshToken प्राप्त करें। लेकिन केवल एक सेटटर सेटAccessToken। जब मैं उपयोगकर्ता से ऑथ कोड प्राप्त करता हूं तो मैं getAuth() -> प्रमाणीकृत चला सकता हूं लेकिन एपीआई यह नहीं कहता कि अगर वह लौटाता है तो एक एक्सेस या रीफ्रेश टोकन है। क्या मुझे getAuth-> setAccessToken सेट करने के लिए प्रमाणित करने का परिणाम पास करने की आवश्यकता है? फिर, के लिए पहुँच प्राप्त करने के लिए क्या है? – unfulvio

+1

भी, Google PHP एपीआई से यह प्रतीत होता है कि एक्सेस टोकन एक जेसन ऑब्जेक्ट है, लेकिन रीफ्रेश टोकन एक स्ट्रिंग है? तो क्या मुझे एथ-> प्रमाणित() विधि प्राप्त करने के लिए रीफ्रेश टोकन पास करना होगा? – unfulvio

+1

यहां कुछ जवाब मिले: https://developers.google.com/identity/protocols/OAuth2WebServer?hl=hi – unfulvio

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