इतना समय पहले नहीं है कि Habré पर uLogin प्राधिकरण विजेट के बारे में
एक लेख था।
जो मुझे वास्तव में पसंद आया, वह आवश्यक क्षेत्रों को निर्दिष्ट करने की क्षमता है, और यदि वे प्रदाता से प्राप्त नहीं होते हैं, तो उपयोगकर्ता को इसे भरने के लिए कहा जाता है। इसलिए कोहना में एक मॉड्यूल लिखने की इच्छा थी, जिससे uLogin विजेट का उपयोग करके उपयोगकर्ता को पंजीकृत करना आसान होगा।
मॉड्यूल की संरचना के बारे में थोड़ा सा
प्रत्येक मॉड्यूल को अलग फ़ोल्डर में MODPATH फ़ोल्डर में रखा जाता है (डिफ़ॉल्ट मॉड्यूल द्वारा)
अंदर, कक्षाएं, कॉन्फ़िगरेशन, और सभी फ़ोल्डर अनुप्रयोग के समान हैं। यह तथाकथित कैस्केडिंग फाइल सिस्टम है,
यहां अधिक विवरण
हमारे मॉड्यूल के लिए हमें केवल कक्षाओं और कॉन्फ़िगर फ़ोल्डरों की आवश्यकता है।
डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल कॉन्फ़िगरेशन फ़ोल्डर में होगी, और, यदि वांछित है, तो इसे एप्लिकेशन / कॉन्फ़िगरेशन में पुनर्परिभाषित किया जा सकता है।
क्लास फ़ोल्डर में ulogin.php फ़ाइल है जिसमें Ulogin क्लास की परिभाषा है:
<?php defined('SYSPATH') or die('No direct script access.'); class Ulogin extends Kohana_Ulogin {}
यह वर्ग कोहना_लोगिन से विरासत में मिला है, जो यदि आवश्यक हो, तो इसे फ़ाइल एप्लिकेशन / कक्षाओं / ulogin.php में रखकर इसे ओवरराइड करने की अनुमति देगा।
चूँकि बेस क्लास कोहन_लोगिन कहा जाता है, यह क्लासेस / कोहना / ulogin.php में स्थित होना चाहिए, क्योंकि कोहना स्टार्टअप के लिए क्लास ढूंढते समय स्लैश के साथ अंडरस्कोर को बदल देता है।
उपयोग करने से पहले, मॉड्यूल को bootstrap.php में जोड़ा जाना चाहिए:
Kohana::modules(array( ...... 'ulogin' => MODPATH.'ulogin',
विजेट प्रदर्शन
प्राधिकरण विजेट को निम्नानुसार प्रदर्शित किया जाता है:
echo Ulogin::factory()->render()
ऐसा होने पर क्या होता है:
स्थैतिक कार्य
public static function factory(array $config = array()) { return new Ulogin($config); }
यूगिन वर्ग का एक उदाहरण बनाता है, एमु को कॉन्फ़िगरेशन के साथ सरणी को पारित करते समय, यह सीधे डिफ़ॉल्ट सेटिंग्स को ओवरराइट करने में सक्षम होने के लिए किया जाता है जब बुलाया जाता है।
क्लास कंस्ट्रक्टर:
public function __construct(array $config = array()) { $this->config = array_merge($this->config, Kohana::$config->load('ulogin')->as_array(), $config); if ($this->config['redirect_uri'] === NULL) $this->config['redirect_uri'] = Request::initial()->url(true); }
कोहाण फ़ंक्शन कोहन का उपयोग करके कॉन्फ़िगरेशन को लोड करता है :: $ config-> लोड और NULL के लिए पुनर्निर्देशित करें। एक सकारात्मक परिणाम के मामले में, सत्यापन केवल उस वर्तमान पते को सेट करता है जिस पर उपयोगकर्ता ने अनुरोध किया था, इसे अनुरोध :: प्रारंभिक () -> url (सच) कहकर प्राप्त किया। सही पैरामीटर कोहन को पते में प्रोटोकॉल को शामिल करने के लिए कहता है। अनुरोध :: प्रारंभिक () का उपयोग प्रारंभ पता प्राप्त करने के लिए किया जाता है।
रेंडर () फ़ंक्शन:
public function render() { $params = 'display='.$this->config['type']. '&fields='.implode(',', array_merge($this->config['username'], $this->config['fields'])). '&providers='.implode(',', $this->config['providers']). '&hidden='.implode(',', $this->config['hidden']). '&redirect_uri='.$this->config['redirect_uri']. '&optional='.implode(',', $this->config['optional']); if (count(self::$_used_id) == 0) { $view = View::factory('ulogin/first'); self::$_used_id[] = 'uLogin'; } else { $view = View::factory('ulogin/second'); do { $uniq_id = "uLogin_".rand(); } while(in_array($uniq_id, self::$_used_id)); self::$_used_id[] = $uniq_id; $view->set('uniq_id', $uniq_id); } return $view->set('cfg', $this->config)->set('params', $params)->render(); }
सबसे पहले, आपको uLogin स्क्रिप्ट पास करने के लिए पैरामीटर बनाने की आवश्यकता है। http_build_query () यहां उपयुक्त नहीं है, क्योंकि यह डेटा (विशेष रूप से, अल्पविराम) को उनके हेक्साडेसिमल कोड (% xx) में एन्कोड करता है। फिर यह जांचा जाता है कि क्या पहला प्रक्षेपण है (सरणी में स्वयं :: $ _ used_id खाली है) या नहीं।
यदि पहला है, तो ulogin / first.php देखें:
<?php if ($cfg['type'] == 'window') :?> <a href="#" id="uLogin"> <img src="http://ulogin.ru/img/button.png" width=187 height=30 alt=""/> </a> <script src="http://ulogin.ru/js/widget.js?<?php echo $params; ?>"></script> <?php else: ?> <div id="uLogin"></div> <script src="http://ulogin.ru/js/widget.js?<?php echo $params; ?>"></script> <?php endif; ?>
इसमें, चयनित मोड के आधार पर, विजेट को कॉल करने के लिए HTML कोड प्रदर्शित किया जाता है।
यदि यह दूसरा zapsuk है, तो हम एक विशिष्ट पहचानकर्ता उत्पन्न करते हैं और देखें ulogin / second.php:
<div id="<?php echo $uniq_id; ?>"></div> <script type='text/javascript'>uLogin.init('id=<?php echo $uniq_id; ?>&<?php echo $params; ?>');</script>
यह केवल आधिकारिक वेबसाइट पर स्थित प्रलेखन के अनुसार विजेट को कॉल करता है
यह सब एक प्राधिकरण विजेट प्रदर्शित करने के लिए लेता है।
परिणाम प्रसंस्करण
मॉड्यूल का उपयोग करके प्रसंस्करण कुछ इस तरह दिखता है:
$ulogin = Ulogin::factory(); if (!$ulogin->mode()) $this->template->content = $ulogin->render(); else { try { $ulogin->login(); } catch(ORM_Validation_Exception $e) { $this->template->errors = $e->errors(''); } }
यही है, हम मोड को कॉल करके मोड की जांच करते हैं (), जिसके बाद हम या तो विजेट प्रदर्शित करते हैं या उपयोगकर्ता को अधिकृत / पंजीकृत करते हैं। उपयोगकर्ता पंजीकरण सही है, उदाहरण के लिए, मिलान ई-मेल /
मोड () फ़ंक्शन केवल $ _POST ['टोकन'] की उपस्थिति के लिए जाँच करेगा:
public function mode() { return !empty($_POST['token']); }
सी लॉगिन () अधिक जटिल है:
public function login() { if (empty($_POST['token'])) throw new Kohana_Exception('Empty token.'); if (!($domain = parse_url(URL::base(), PHP_URL_HOST))) { $domain = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; } $s = Request::factory('http://ulogin.ru/token.php?token=' . $_POST['token'] . '&host=' . $domain)->execute()->body(); $user = json_decode($s, true); $orm_user = ORM::factory('user', array('identity' => $user['identity'])); if (!$orm_user->loaded()) { $data['username'] = ''; foreach($this->config['username'] as $part_of_name) $data['username'] .= (empty($user[$part_of_name]) ? '' : (' '.$user[$part_of_name])); $data['username'] = trim($data['username']); if (!$data['username']) throw new Kohana_Exception('Username fields not set in config/ulogin.php'); $data['password'] = 'ulogin_autogenerated_password'; $data['identity'] = $user['identity']; $data['network'] = $user['network']; $cfg_fields = array_merge($this->config['fields'], $this->config['optional']); foreach($cfg_fields as $field) { if (!empty($user[$field])) $data[$field] = $user[$field]; } $orm_user->values($data); $orm_user->create(); $orm_user->add('roles', ORM::factory('role', array('name' => 'login'))); Auth::instance()->force_login($orm_user); } else { Auth::instance()->force_login($orm_user); } }
यहाँ क्या हो रहा है:
हम टोकन को फिर से जांचते हैं (अचानक किसी को बस लॉगिन () कहा जाता है), जिसके बाद हम मेजबान को uLogin में स्थानांतरित करने की कोशिश करते हैं: या तो आधार पते से (कोहाणा में bootstrap.php में संकेत :: init) (), या $ _SERVER के माध्यम से [ 'HTTP_HOST'] या $ _SERVER ['SERVER_NAME']।
फिर हम उपयोगकर्ता के डेटा को प्राप्त करने के लिए एक अनुरोध करते हैं:
$s = Request::factory('http://ulogin.ru/token.php?token=' . $_POST['token'] . '&host=' . $domain)->execute()->body(); $user = json_decode($s, true);
परिणाम कुछ इस प्रकार है (Google के लिए उदाहरण):
array(6) ( "network" => string(6) "google" "identity" => string(50) " , https://plus.google.com/u/0/google+ /" "uid" => string(21) "google+ " "email" => string(21) "e-mail" "first_name" => string(10) "" "last_name" => string(14) "" )
इसके बाद, इसे डेटाबेस में खोजने का प्रयास करें, इसके अद्वितीय URL का उपयोग करें: $ उपयोगकर्ता ['पहचान']:
$orm_user = ORM::factory('user', array('identity' => $user['identity']));
यदि पाया गया ($ orm_user-> भरी हुई () == सत्य), तो इसे अधिकृत करें:
Auth::instance()->force_login($orm_user);
अन्यथा, यह पंजीकृत होना चाहिए:
- हम उपयोगकर्ता नाम बनाते हैं:
$data['username'] = ''; foreach($this->config['username'] as $part_of_name) $data['username'] .= (empty($user[$part_of_name]) ? '' : (' '.$user[$part_of_name])); $data['username'] = trim($data['username']);
- मॉडल फ़ील्ड भरें:
$data['password'] = 'ulogin_autogenerated_password'; $data['identity'] = $user['identity']; $data['network'] = $user['network']; $cfg_fields = array_merge($this->config['fields'], $this->config['optional']); foreach($cfg_fields as $field) { if (!empty($user[$field])) $data[$field] = $user[$field]; } $orm_user->values($data);
- हम उपयोगकर्ता बनाते हैं, उसके लिए लॉगिन भूमिका जोड़ें और फिर उसे अधिकृत करें:
$orm_user->create(); $orm_user->add('roles', ORM::factory('role', array('name' => 'login'))); Auth::instance()->force_login($orm_user);
जीथब पर उपलब्ध स्रोत कोड
जैसा कि आप देख सकते हैं, कोहल के लिए यूलॉगिन और लेखन मॉड्यूल का उपयोग करना कोई समस्या नहीं है।
सौभाग्य है
UPD: जोड़े गए दृश्य
UPD2: थोड़ा कोड और लेख फिर से लिखा, धन्यवाद
डाहलिक