2012-04-11 14 views
5

मैंने Google एपीआई का उपयोग करने के तरीके के दस्तावेज, उदाहरण और ट्यूटोरियल पढ़े हैं, मेरे पास एक मिनी-ऐप पहले से चल रहा है जो आपकी नवीनतम गतिविधियां और जानकारी दिखाता है, लेकिन मैं टोकन स्टोर करने के लिए सत्र का उपयोग करें।Google+ ओएथ एपीआई स्टोर और पहले लॉगिन और प्राधिकरण के बाद टोकन पुनर्प्राप्त करें

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

$client = new apiClient(); 
$client->setApplicationName(APP_NAME); 
$client->setClientId(CLIENT_ID); 
$client->setClientSecret(CLIENT_SECRET); 
$client->setRedirectUri(REDIRECT_URL); 
$client->setDeveloperKey(DEV_KEY); 

$plus = new apiPlusService($client); 
$google_userinfo = new apiOauth2Service($client); 

$message = ""; 

// In a real application this would be stored in a database, and not in the session! 
if (isset($_SESSION['token'])) 
    $client->setAccessToken($_SESSION['token']); 

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

if (isset($_GET['code'])) { 
    $client->authenticate(); 
    // In a real application this would be stored in a database, and not in the session! 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); 
} 
... 
//Somewhere here, I added a function that ties $_SESSION['token'] to the user's info. 
... 
<form action="" method="post" id="form1" name="form1"> 
    <fieldset> 
     <div id="main-url-section" style="width: 50%;margin: 0px auto;text-align: center;"> 
     <?php 
      $authUrl = $client->createAuthUrl(); 
      print "<p><a class='login' href='$authUrl'>Log me in!</a></p>"; 
     ?>         
     </div> 
    </fieldset> 
</form> 

आप मदद के लिए बहुत बहुत शुक्रिया:

कोड स्निपेट है!

सादर,

जॉन

उत्तर

9

आप गूगल, लोग हैं, जो पहले से ही अपने आवेदन के लिए अधिकृत किया के लिए प्राधिकरण संकेत छोड़ शीर्ष पर आपके विन्यास ब्लॉक में इस कोड को जोड़ना चाहते हैं तो:

$client->setAccessType("online"); 
$client-> setApprovalPrompt("auto"); 

इस समाधान के साथ एक पकड़ है: जब आप अपना ओएथ नृत्य पूरा करते हैं तो आपको रीफ्रेश टोकन नहीं मिलेगा। इसका अर्थ यह है कि हर बार जब कोई नया एक्सेस लाने के लिए आपके एक्सेस टोकन की अवधि समाप्त हो जाती है तो आपके उपयोगकर्ताओं को Google की प्रमाणीकरण सेवा पर रीडायरेक्ट किया जाएगा। यह लगभग हर घंटे होगा।

पृष्ठभूमि जानकारी

डिफ़ॉल्ट रूप से पीएचपी क्लाइंट लाइब्रेरी offline access प्रदान करने के लिए कॉन्फ़िगर किया गया है। आप इसे source code में देख सकते हैं। जब यह मोड सक्षम होता है तो ओएथ प्रवाह refresh token उत्पन्न करेगा जिसका उपयोग नए एक्सेस टोकन को आवश्यकतानुसार अनुरोध करने के लिए किया जा सकता है। आप यह भी हो रहा है कि यह भी हो रहा है। PHP क्लाइंट लाइब्रेरी आपके लिए इनमें से अधिकतर का ख्याल रखती है।

यह ताज़ा टोकन एक लागत पर आता है, हालांकि। आप इसे स्टोर करने के लिए जिम्मेदार हैं। यदि आप इसे खो देते हैं, तो आपके उपयोगकर्ता को आपके आवेदन को दोबारा जारी करने के लिए फिर से अधिकृत करना होगा। जिस तरह से आप इसे स्टोर करते हैं, वह आपके कार्यान्वयन के विवरण पर बहुत निर्भर करता है। यदि आप इसे टिकाऊ बना सकते हैं तो सत्र डेटा ऐसा करने का एक उचित तरीका है।

+0

इस उत्तर के लिए धन्यवाद! यह उपयोगी है और मैं इसे अस्थायी फिक्स के रूप में उपयोग कर सकता हूं। :) मैंने इसे पहले से ही चेक कर लिया है। लेकिन क्या आपको पता है कि किसी क्लाइंट को $ क्लाइंट-> getAccessToken() में टोकन स्टोर करने के तरीके पर किसी भी पोस्ट का लिंक है या नहीं? और जब उपयोगकर्ता लॉग इन करता है तो उनका उपयोग करें? – user1239714

+0

@ user1239714: मुझे यहां सलाह के लिए लिंक करने के लिए एक विशिष्ट स्थान के बारे में पता नहीं है। यह पूरी तरह से निर्भर करता है कि आप अपने आवेदन में शेष डेटा कैसे बनाते हैं। उदाहरण के लिए, यदि आप एक सामान्य LAMP एप्लिकेशन लिख रहे हैं, तो बाद में याद करने के लिए MySQL में रीफ्रेश टोकन को स्टोर करना समझ में आता है। – mimming

+1

@ जेनी मर्फी "आप इसे स्रोत कोड में देख सकते हैं"। लिंक टूटा हुआ है। क्या आप कृपया एक और नमूना – knightrider

0

यह एक पुराना सवाल है लेकिन ऐसा लगता है कि जवाब पूरा नहीं हुआ था।

स्वीकार्य उत्तर इस तरह से काम करता है कि उपयोगकर्ता Google Auth सर्वर के माध्यम से जाता है, बस एथ स्क्रीन नहीं देखता है। सवाल टोकन को संग्रहीत करने और उपयोगकर्ता को Google सर्वर पर भेजने के बिना फिर से इसका उपयोग करने के बारे में था।

तो यदि आप यही करना चाहते हैं (और यह आपको उपयोगकर्ता डेटा तक पहुंचने की अनुमति भी देगा, भले ही वे वर्तमान में आपके ऐप का उपयोग नहीं कर रहे हों), आपको केवल एक टोकन एक्सेस करने के लिए पूछना है जिसमें रीफ्रेश टोकन शामिल है ।

आप इसे ऑफ़लाइन एक्सेस प्रकार (जिस तरह से डिफ़ॉल्ट नहीं है) का उपयोग करके ऐसा करते हैं - उदाहरण के लिए php: $client->setAccessType("offline"); में।

बस ध्यान रखें कि आपके द्वारा प्राप्त पहुंच टोकन में उपयोगकर्ता द्वारा पहले प्रारंभिक प्रमाणीकरण में केवल ताज़ा टोकन शामिल होगा, इसलिए आपको स्टोर करने की आवश्यकता है।

फिर आप क्लाइंट के साथ उस एक्सेस टोकन का उपयोग कर सकते हैं, भले ही इसे समाप्त हो जाए, और ग्राहक इसे रीफ्रेश करने और एक नया प्राप्त करने का ख्याल रखेगा।

आशा है कि मदद करता है, आमोस