जब तक उपयोगकर्ता प्राधिकरण को रद्द नहीं करता तब तक 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 विंडो में एक अलग विधि में डाल रहा हूं (जो भी उपयोग करता है वही ग्राहक आईडी और गुप्त और ऑफलाइन विधि भी सेट करता है)। और प्राधिकरण प्राप्त करने के लिए काम कर रहा है। मैं कैलेंडर प्राप्त कर सकता हूं। यह लंबे समय तक नहीं टिकता है ...
धन्यवाद ... लेकिन मुझे एक्सेस टोकन और तुरंत रीफ्रेश टोकन दोनों की आवश्यकता क्यों है? एपीआई में दो विधियां हैं IccessToken और getRefreshToken प्राप्त करें। लेकिन केवल एक सेटटर सेटAccessToken। जब मैं उपयोगकर्ता से ऑथ कोड प्राप्त करता हूं तो मैं getAuth() -> प्रमाणीकृत चला सकता हूं लेकिन एपीआई यह नहीं कहता कि अगर वह लौटाता है तो एक एक्सेस या रीफ्रेश टोकन है। क्या मुझे getAuth-> setAccessToken सेट करने के लिए प्रमाणित करने का परिणाम पास करने की आवश्यकता है? फिर, के लिए पहुँच प्राप्त करने के लिए क्या है? – unfulvio
भी, Google PHP एपीआई से यह प्रतीत होता है कि एक्सेस टोकन एक जेसन ऑब्जेक्ट है, लेकिन रीफ्रेश टोकन एक स्ट्रिंग है? तो क्या मुझे एथ-> प्रमाणित() विधि प्राप्त करने के लिए रीफ्रेश टोकन पास करना होगा? – unfulvio
यहां कुछ जवाब मिले: https://developers.google.com/identity/protocols/OAuth2WebServer?hl=hi – unfulvio