9

ऑनलाइन केकफ़्प ऑथ घटक के साथ फेसबुक लॉगिन के एकीकरण पर संसाधनों को बहुत कम नहीं लगता है। मुझे निम्नलिखित संसाधन मिल गए हैं:मैं केकेएफपी 2.x के साथ फेसबुक एसडीके लॉगिन कैसे एकीकृत करूं?

  1. पुराना Bakery Article केकफ़्पी 1.3 का उपयोग कर? और कहा कि विकास में हो रहा है फेसबुक एसडीके
  2. Cakephp Plugin by webtechnick के एक पुराने संस्करण

इस के अलावा मैं कोई निश्चित संसाधन नहीं मिले। मैं चाहता था कि एकीकरण लचीला हो (एक जादू प्लगइन के उपयोग के बिना) संभव हो। तो बहुत से शोध के बाद मैंने आखिरकार एक सभ्य समाधान तैयार किया जिसे मैं आज यहां साझा कर रहा हूं। कृपया योगदान दें क्योंकि मैं केक के लिए नया हूं।

उत्तर

29

सहज उपयोगकर्ता प्रमाणीकरण के लिए फेसबुक प्रमाणीकरण के साथ CakePHP 2.x प्रमाणीकरण

शुरू करने के लिए आप शानदार cakePHP Auth Component पर पढ़ सकते हैं और CakePHP पुस्तक 2.x से Simple Authentication and Authorization Application tutorial का पालन करना चाहिए की एकता (आप यह मानते हुए भी श्रृंखला से पहले दो ट्यूटोरियल का पालन किया है। के बाद आप कर रहे हैं, आप उपयोगकर्ता प्रमाणीकरण और प्राधिकरण के साथ एक सरल cakePHP आवेदन का निर्माण करने के

इसके बाद आप facebook SDK डाउनलोड करने और फेसबुक से एक App ID प्राप्त करना चाहिए कामयाब रहे चाहिए।।


सबसे पहले हम फेसबुक एसडीके को ऐप/विक्रेताओं में कॉपी करेंगे। फिर हम इसे AppController beforeFilter विधि में आयात और प्रारंभ करेंगे।

//app/Controller/AppController.php 

public function beforeFilter() { 
    App::import('Vendor', 'facebook-php-sdk-master/src/facebook'); 
    $this->Facebook = new Facebook(array(
     'appId'  => 'App_ID_of_facebook', 
     'secret' => 'App_Secret' 

    )); 

    $this->Auth->allow('index', 'view'); 
} 

हम AppController में फेसबुक एसडीके आरंभ कर रहे हैं ताकि हम आवेदन बाहर उस तक पहुँच के माध्यम से होगा। इसके बाद हम एसडीके का उपयोग करके फेसबुक लॉगिन यूआरएल उत्पन्न करेंगे और इसे देखने के लिए पास करेंगे। मैं आमतौर पर beforeRender विधि में ऐसा करता हूं।

नोट: उपरोक्त कॉन्फ़िगरेशन विवरण (ऐपआईडी & गुप्त) को ऐप/कॉन्फ़िगर/facebook.php में अधिमानतः सहेजा जाना चाहिए। आपको cake Configure का उपयोग करना चाहिए।

//app/Controller/AppController.php 

public function beforeRender() { 
    $this->set('fb_login_url', $this->Facebook->getLoginUrl(array('redirect_uri' => Router::url(array('controller' => 'users', 'action' => 'login'), true)))); 
    $this->set('user', $this->Auth->user()); 
} 

हम इतना है कि हम सभी उपयोगकर्ताओं को लॉग इन नहीं है फेसबुक लॉगइन करने के लिए इस लिंक पर प्रदर्शित कर सकते हैं हमारे लेआउट अद्यतन करेगा। गौर करें कि हम अपने आवेदन पत्र उपयोगकर्ता/लॉगिन कार्रवाई करने के लिए redirect_uri निर्धारित किया है। ऐसा इसलिए है कि एक बार फेसबुक ने उपयोगकर्ता को प्रमाणीकृत कर दिया है, हम उसे केक :: एथ का उपयोग करने में भी लॉग इन कर सकते हैं। including the solution for this question के लिए इसके कई फायदे हैं।

<!-- App/Views/Layouts/default.ctp just after <div id="content"> --> 
<?php 
    if($user) echo 'Welcome ' . $user['username']; 
    else { 
     echo $this->Html->link('Facebook Login', $fb_login_url) . ' | '; 
     echo $this->Html->link('Logout', array('controller' => 'user', 'action' => 'logout')); 
?> 

जब उपयोगकर्ता लॉगिन लिंक पर क्लिक करता है, तो फेसबुक एसडीके उपयोगकर्ता लॉगिन करेगा और उन्हें हमारे ऐप उपयोगकर्ता/लॉगिन पर रीडायरेक्ट करेगा। हम इसे संभालने के लिए इस क्रिया को अपडेट करेंगे:

// App/Controller/UsersController.php 
// Handles login attempts from both facebook SDK and local 
public function login() 
{ 
    // If it is a post request we can assume this is a local login request 
    if ($this->request->isPost()){ 
     if ($this->Auth->login()){ 
      $this->redirect($this->Auth->redirectUrl()); 
     } else { 
      $this->Session->setFlash(__('Invalid Username or password. Try again.')); 
     } 
    } 

    // When facebook login is used, facebook always returns $_GET['code']. 
    elseif($this->request->query('code')){ 

     // User login successful 
     $fb_user = $this->Facebook->getUser();   # Returns facebook user_id 
     if ($fb_user){ 
      $fb_user = $this->Facebook->api('/me');  # Returns user information 

      // We will varify if a local user exists first 
      $local_user = $this->User->find('first', array(
       'conditions' => array('username' => $fb_user['email']) 
      )); 

      // If exists, we will log them in 
      if ($local_user){ 
       $this->Auth->login($local_user['User']);   # Manual Login 
       $this->redirect($this->Auth->redirectUrl()); 
      } 

      // Otherwise we ll add a new user (Registration) 
      else { 
       $data['User'] = array(
        'username'  => $fb_user['email'],        # Normally Unique 
        'password'  => AuthComponent::password(uniqid(md5(mt_rand()))), # Set random password 
        'role'   => 'author' 
       ); 

       // You should change this part to include data validation 
       $this->User->save($data, array('validate' => false)); 

       // After registration we will redirect them back here so they will be logged in 
       $this->redirect(Router::url('/users/login?code=true', true)); 
      } 
     } 

     else{ 
      // User login failed.. 
     } 
    } 
} 

और हम कर चुके हैं! जैसा कि आप देख सकते हैं, इस कार्रवाई द्वारा भारी भारोत्तोलन किया जाता है। आपको उपरोक्त कोड में से कुछ को UserModel में ले जाना चाहिए। तो यहां क्या हो रहा है इसका एक सारांश है।

सबसे पहले हम जांच करते हैं कि लॉगिन अनुरोध हमारे आवेदन @ उपयोगकर्ता/लॉगिन के लॉगिन फॉर्म से भेजा गया है या नहीं। यदि ऐसा है, तो हम बस उपयोगकर्ता को लॉग इन करते हैं।अन्यथा हम जाँच उपयोगकर्ता हमारे डेटाबेस में मौजूद है और में उसे लोग इन यदि वह करता है या एक नया उपयोगकर्ता बनाने के लिए, और उसके बाद में उसे लोग इन यदि।

उनके facebook_id की तरह, अपने ईमेल की तुलना में अधिक के साथ यहाँ उपयोगकर्ता सत्यापित करने के लिए सावधान रहें । अन्यथा एक मौका है कि उपयोगकर्ता अपना फेसबुक ईमेल बदल सकता है और आपके आवेदन के दूसरे उपयोगकर्ता को हाइजैक कर सकता है।

हैप्पी कोडिंग!

+0

हाय शाफी, मैंने आपके उदाहरण का पालन किया है, हालांकि किसी कारण से मुझे यह संदेश 10 बार में से 1 मिलता है। "OAuthException: वर्तमान उपयोगकर्ता के बारे में जानकारी पूछने के लिए एक सक्रिय एक्सेस टोकन का उपयोग किया जाना चाहिए" क्या आपके पास इसके लिए कोई समाधान है? – Chris

+0

एक वैध दृष्टिकोण माना जाता है (अभी तक परीक्षण नहीं किया गया है)। तो क्या आप इसे स्वीकार किए गए उत्तर के रूप में चिह्नित कर सकते हैं क्योंकि आप इसका उपयोग कर समाप्त कर चुके हैं? – Nunser

+0

धन्यवाद आदमी, इससे मुझे बहुत मदद मिली, केवल एक चीज है, मैं एक नए यूआरएल पर रीडायरेक्ट करने के बजाय लॉगिन की पॉपअप विंडो रखना चाहता हूं: '' डिस्प्ले '=> "पॉपअप",' getLoginUrl काम नहीं लग रहा है। धन्यवाद – dav

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