2015-11-24 19 views
5

मैं जीमेल से ईमेल पढ़ने के लिए Google API क्लाइंट का उपयोग कर रहा हूं। अब मैं एक क्रोनबॉज जोड़ना चाहता हूं ताकि यह हर 5 मिनट में मेल पढ़ सके।Google API क्लाइंट और क्रोनबॉज

Google API क्लाइंट का उपयोग करने में समस्या यह है कि उपयोगकर्ता को प्राधिकरण लिंक पर पहली बार क्लिक करने की अनुमति देने और उपयोगकर्ता को Google API क्लाइंट का उपयोग करने की अनुमति देने की आवश्यकता है।

मेरे पास एक फ़ंक्शन इनबॉक्स है जिसमें एक फ़ंक्शन प्रारंभ होता है जो Google API क्लाइंट को initliazes करता है। लेकिन cronjob काम नहीं करता है क्योंकि मुझे access_token प्राप्त करना है।

public function initialize() { 
    $configuration = Configuration::getConfiguration('class_Inbox'); 

    // Creates the Google Client 
    $this->client = new Google_Client(); 
    $this->client->setApplicationName('Tiptsernetwork'); 
    $this->client->setClientId($configuration['clientId']); 
    $this->client->setClientSecret($configuration['clientSecret']); 
    $this->client->setRedirectUri('http://www.tipsternetwork.nl/cronjob/authenticate'); 
    $this->client->addScope('https://mail.google.com/'); 
    $this->client->setApprovalPrompt('force'); 
    $this->client->setAccessType('offline'); 

    // Creates the Google Gmail Service 
    $this->service = new Google_Service_Gmail($this->client); 

    // Authenticates the user. 
    if (isset($_GET['code'])) { 
     $this->authenticate($_GET['code']); 
    } 

    // Check if we have an access token in the session 
    if (isset($_SESSION['access_token'])) { 
     $this->client->setAccessToken($_SESSION['access_token']); 
    } else { 
     $loginUrl = $this->client->createAuthUrl(); 
     echo '<a href="'.$loginUrl.'">Click Here</a>'; 
    } 

    // If the token is expired it used the refresh token to generate a new Access Token 
    if($this->client->isAccessTokenExpired()) { 
     $this->client->refreshToken($configuration['refreshToken']); 
    } 
} 

public function authenticate($code) { 
    // Creates and sets the Google Authorization Code 
    $this->client->authenticate($code); 
    $_SESSION['access_token'] = $this->client->getAccessToken(); 

    $this->client->refreshToken($configuration['refreshToken']); 

    // Redirect the user back after authorizaton 
    $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header('Location: ' . filter_var($url, FILTER_VALIDATE_URL)); 
} 

क्या आप जानते हैं कि रीफ्रेश टोकन या जो भी हो, इसे ठीक करने के लिए इसे कैसे ठीक किया जाए? मैं इसे काम नहीं कर सकता और मैं विचारों से बाहर हूं।

मैं यूआरएल तक पहुँचने और "यहां क्लिक करें" और यह अनुमति देते हैं यह सफलतापूर्वक नहीं बल्कि एक cronjob क्योंकि मैं "यहाँ क्लिक करें" यूआरएल पर क्लिक नहीं कर सकते हैं के साथ काम करता पर क्लिक कर रहा हूँ तो ...

मुझे आशा है कि आप लोग इसे समझते हैं और मेरी मदद कर सकते हैं :)।

सधन्यवाद,
Yanick

उत्तर

3

इस उत्तर अधिक पर एक सामान्य दृष्टिकोण कैसे, ओ-Auth2 फ्लो का उपयोग करने के बाद से मैंने कुछ समय पहले एक ऐसी ही समस्या का सामना करना पड़ रहा है। मुझे उम्मीद है कि यह थोड़ा सा मदद करेगा।

एक संभावित समस्या (ओएथ के सही उपयोग को समझने में) यह है कि आप स्वीकृति संकेत के रूप में force का उपयोग करते हैं। जब आप पहले से ही करते हैं तो उपयोगकर्ता को अनुमति देने के लिए मजबूर क्यों करते हैं?

जब कोई उपयोगकर्ता आपके बैकएंड के खिलाफ हस्तक्षेप करता है, तो उससे पूछा जाता है कि क्या वह scope में परिभाषित कार्यों को आपकी एप्लिकेशन अनुमति देना चाहता है। पहली बार आपके एप्लिकेशन को यह अनुमतियां मिलती हैं (उपयोगकर्ता द्वारा "सहमत" -बटन पर क्लिक करके) आपकी स्क्रिप्ट को access_token और refresh_token Google से प्राप्त होगा।

access_token का उपयोग उस प्रमाणीकृत उपयोगकर्ता के खाते के साथ Google-API को एक्सेस करने के लिए किया जाता है। यदि आप उपयोगकर्ता को उपस्थित होने के बिना Google एपीआई एक्सेस करना चाहते हैं तो आपको कहीं भी अपने सर्वर पर स्टोर करना चाहिए (इसलिए ऑफ़लाइन-एक्सेस) कहा जाता है। इस टोकन के साथ आप उपयोगकर्ता के नाम पर कुछ भी कर सकते हैं (परिभाषित स्कॉप्स तक सीमित)। यह 1 घंटे या उससे भी कम समय के बाद अवैध हो जाएगा। पूरे समय (1 घंटे का) आप उपयोगकर्ता को उपस्थित होने के बिना इस टोकन का उपयोग कर सकते हैं!

refresh_token की आवश्यकता है जब access_token इस अवधि के बाद अमान्य अमान्य हो। और केवल तभी। आपको केवल refresh_tokenONCE प्राप्त होता है और यह कभी भी नहीं बदलेगा। यह बहुत महत्वपूर्ण डेटा है और सुरक्षित रूप से संग्रहीत किया जाना चाहिए!

तो यदि आप उपयोगकर्ता की उपस्थिति के बिना Google एपीआई एक्सेस करना चाहते हैं तो आपको संग्रहित access_token के साथ एपीआई कॉल करना होगा। अगर प्रतिक्रिया token expired की तरह कुछ है (मुझे लगता है कि इसके लिए एक त्रुटि कोड था - अनुसंधान करना है), तो आप कहीं भी सुरक्षित रीफ्रेश टोकन के साथ $client->refreshToken($refreshToken) पर कॉल करें। आपको उस से नया access_token मिलेगा। इस access_token के साथ आप उपयोगकर्ता को कहीं भी क्लिक करने के बिना आगे काम कर सकते हैं (दोबारा)।

अगली बार जब नया access_token अवांछित अमान्य है, तो आपको पहले refresh_token का उपयोग करना होगा और यही वजह है कि यह refresh_token इतना महत्वपूर्ण है।

मुझे उम्मीद है कि मैं आपकी मदद कर सकता हूं। यदि नहीं, तो कृपया इस पर टिप्पणी करें।

मुबारक कोडिंग

संसाधन

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