
Yii ढांचे पर एक परियोजना को लागू करते समय, मुझे तृतीय-पक्ष सेवाओं (Google, फेसबुक, ट्विटर, आदि) के माध्यम से उपयोगकर्ताओं को पंजीकृत करने और अधिकृत करने का काम था।
इस समस्या के दो समाधान हैं:
- एक प्राधिकरण सेवा का उपयोग करें, उदाहरण के लिए लॉगिन;
- प्रत्येक सेवा के लिए स्वतंत्र रूप से प्राधिकरण कार्यों को लागू करें।
अद्यतन: वर्तमान संस्करण और सेटअप निर्देश
github.com पर उपलब्ध हैं। इस लेख में दिए गए निर्देश EAuth संस्करण <= 1.1.3 के लिए उपयुक्त हैं।
प्राधिकरण सेवा का उपयोग करने के पेशेवरों:
- सादगी और स्थापना की गति;
- प्रत्येक प्रदाता के माध्यम से प्राधिकरण की पेचीदगियों को सीखने की आवश्यकता नहीं है।
हालाँकि, स्व-प्राधिकरण के कई अन्य फायदे हैं:
- प्राधिकरण प्रक्रिया पर पूर्ण नियंत्रण: प्रदाता प्राधिकरण विंडो में क्या लिखा जाएगा, हमें कौन सा डेटा प्राप्त होगा, आदि;
- साइट के डिजाइन के अनुसार प्राधिकरण विजेट की उपस्थिति को बदलने की क्षमता;
- जब OAuth के माध्यम से अधिकृत किया जाता है, तो प्रदाता द्वारा प्रदान किए जाने पर, एपीआई विधियों को कॉल करना संभव है;
- तृतीय-पक्ष सेवाओं पर कम निर्भरता - अधिक विश्वसनीयता।
मैंने मुख्य रूप से दूसरा विकल्प चुना क्योंकि yii के लिए कोई तैयार एक्सटेंशन नहीं थे, और मैं सोच रहा था कि इस तरह के प्राधिकरण सिस्टम अंदर से कैसे काम करते हैं। प्रारंभ में, यह एक उपयोगकर्ता प्रबंधन मॉड्यूल का हिस्सा था। लेकिन बाद में इस कार्यक्षमता को एक अलग विस्तार के रूप में आवंटित किया गया था, जिसे आसानी से किसी भी परियोजना में उपयोग किया जा सकता है।
1. प्राधिकरण प्रणाली के लिए आवश्यकताएँ
विस्तार को डिजाइन करते समय, मुझे निम्नलिखित सिद्धांतों द्वारा निर्देशित किया गया था:
- विभिन्न प्रकार की सेवाओं के माध्यम से प्राधिकरण की पेचीदगियों को अनदेखा करने की आवश्यकता, प्रत्येक सेवा के लिए एडेप्टर का उपयोग।
- एक अद्वितीय प्राधिकरण पहचानकर्ता प्राप्त करना जिसका उपयोग हमारे आवेदन में उपयोगकर्ता को पंजीकृत करने के लिए किया जा सकता है।
- उपयोगकर्ता की अतिरिक्त जानकारी प्राप्त करने के लिए मानक प्राधिकरण कक्षाओं का विस्तार करने की क्षमता।
- आवश्यक सेवा के प्राधिकरण वर्ग का विस्तार करके सामाजिक नेटवर्क के एपीआई के साथ काम करने की क्षमता।
- साइट द्वारा समर्थित सेवाओं की सूची को अनुकूलित करने की क्षमता, प्राधिकरण विजेट की उपस्थिति को फिर से परिभाषित करती है। हमारे आवेदन को बंद किए बिना प्राधिकरण के लिए पॉपअप विंडो का उपयोग करने की क्षमता।
2. EAuth विस्तार
उपरोक्त सभी आवश्यकताओं के कार्यान्वयन के परिणामस्वरूप, EAuth एक्सटेंशन का जन्म हुआ।
फिलहाल, विस्तार में शामिल हैं:
- एक घटक जिसमें सहायक कार्य होते हैं।
- एक विजेट जो आइकन के रूप में सेवाओं की एक सूची प्रदर्शित करता है और एक पॉपअप विंडो में प्राधिकरण की अनुमति देता है।
- OpenID या OAuth पर आधारित सेवाओं को जोड़ने के लिए आधार कक्षाएं।
- Google, Yandex, Twitter, Facebook, VKontakte और Mail.ru के माध्यम से प्राधिकरण के लिए तैयार कक्षाएं।
3. स्थापना
सबसे पहले आपको एक्सटेंशन को
`protected/extensions/eauth`
में
डाउनलोड और अनज़िप करना
`protected/extensions/eauth`
।
3.1 निर्भरता
एक्सटेंशन क्रमशः OpenID और OAuth के साथ काम करने के लिए
loid और
EOAuth का उपयोग करता है। इन एक्सटेंशन को
`protected/extensions`
निर्देशिका में डाउनलोड और रखा जाना चाहिए।
3.2 सेटअप
`main.php`
के विन्यास में
`main.php`
आपको जोड़ने की आवश्यकता है:
'import'=>array( 'ext.eoauth.*', 'ext.eoauth.lib.*', 'ext.lightopenid.*', 'ext.eauth.services.*', ), 'components'=>array( 'loid' => array( 'class' => 'ext.lightopenid.loid', ), 'eauth' => array( 'class' => 'ext.eauth.EAuth', 'popup' => true,
विस्तार में केवल दो पैरामीटर हैं:
popup
और
services
।
popup
पैरामीटर प्रदाता की साइट पर रीडायरेक्ट करने के बजाय, प्राधिकरण के लिए पॉपअप विंडो का उपयोग करने के लिए जिम्मेदार है।
services
पैरामीटर हमारे एप्लिकेशन द्वारा समर्थित प्रदाताओं की एक सूची है। प्रत्येक प्रदाता के लिए, आप प्रदाता के आधार वर्ग के आधार पर अपनी खुद की कक्षा निर्दिष्ट कर सकते हैं। OAuth प्रदाताओं के लिए कुंजी प्राप्त करने के लिए, आपको उचित प्रदाता के साथ अपना आवेदन पंजीकृत करना होगा।
4. उपयोग करें
एक उदाहरण के रूप में, आइए
`yiic webapp create`
द्वारा उत्पन्न मानक Yii एप्लिकेशन को
`yiic webapp create`
और Google और Yandex के माध्यम से प्राधिकरण विकल्प जोड़ें (हमने OAuth प्रदाताओं को कनेक्ट नहीं किया है ताकि कुंजियों के साथ गड़बड़ न हो)। तैयार
डेमो देखें।
4.1 उपयोगकर्ता क्षमता
सबसे पहले,
ServiceUserIdentity
क्लास बनाएं, जो हमारे एक्सटेंशन का उपयोग करने के लिए लॉगिंग के लिए जिम्मेदार है। कक्षा कोड:
<?php class ServiceUserIdentity extends UserIdentity { const ERROR_NOT_AUTHENTICATED = 3; protected $service; public function __construct($service) { $this->service = $service; } public function authenticate() { if ($this->service->isAuthenticated) { $this->username = $this->service->getAttribute('name'); $this->setState('id', $this->service->id); $this->setState('name', $this->username); $this->setState('service', $this->service->serviceName); $this->errorCode = self::ERROR_NONE; } else { $this->errorCode = self::ERROR_NOT_AUTHENTICATED; } return !$this->errorCode; } }
मानक प्रदाता कक्षाएं हमें दो विशेषताएँ प्रदान करती हैं:
id
और
name
। इसके अलावा, प्रत्येक प्रदाता का अपना पहचानकर्ता होता है, जो
serviceName
संपत्ति में निहित होता है।
ServiceUserIdentity
वर्ग में
ServiceUserIdentity
हम वर्तमान उपयोगकर्ता के सत्र (और कुकी) में इन विशेषताओं को संग्रहीत करते हैं।
4.2 SiteContoller
संपादन
दूसरा कदम
`site/login`
। निम्नलिखित कोड को कार्रवाई की शुरुआत में जोड़ें:
public function actionLogin() { $service = Yii::app()->request->getQuery('service'); if (isset($service)) { $authIdentity = Yii::app()->eauth->getIdentity($service); $authIdentity->redirectUrl = Yii::app()->user->returnUrl; $authIdentity->cancelUrl = $this->createAbsoluteUrl('site/login'); if ($authIdentity->authenticate()) { $identity = new ServiceUserIdentity($authIdentity);
सबसे पहले, हम चर
$_GET['service']
की उपस्थिति के लिए जाँच करते हैं। यदि ऐसा कोई चर मौजूद है, तो हम प्रदाता वर्ग का एक उदाहरण बनाते हैं और प्राधिकरण के पुनर्निर्देशन और निरसन के लिए पथों को कॉन्फ़िगर करते हैं। तो फिर हम
`$authIdentity->authenticate()`
विधि कहते हैं, जो हमारे लिए सभी जादू करती है। यदि
`$authIdentity->redirect();`
पॉपअप विंडो को सही रूप से बंद करने के लिए
`$authIdentity->redirect();`
`$authIdentity->cancel();`
4.3 दृश्य का संपादन `protected/views/site/login.php`
मानक विजेट का उपयोग करने के लिए, मुख्य फ़ॉर्म के बाद बस कुछ पंक्तियाँ जोड़ें:
<h2>Do you already have an account on one of these sites? Click the logo to log in with it here:</h2> <?php Yii::app()->eauth->renderWidget(); ?>
विजेट की उपस्थिति को बदलने के लिए, आप फ़ाइल को
`protected/extensions/eauth/views/auth.php`
`[theme_name]/views/EAuthWidget/auth.php`
।
4.4 परिणाम
सभी चरणों को पूरा करने के बाद, हम अपनी वेबसाइट खोल सकते हैं और लॉगिन पेज पर जा सकते हैं। मानक प्राधिकरण फ़ॉर्म के बाद, प्राधिकरण सेवाओं के आइकन दिखाई देंगे:

क्लिक करते समय, उदाहरण के लिए, Google आइकन पर, एक पॉपअप विंडो खुलेगी:

यदि उपयोगकर्ता हमारे आवेदन के लिए प्राधिकरण की पुष्टि करता है, तो उपयोगकर्ता को लॉग इन किया जाएगा और
redirectUrl
पेज पर रीडायरेक्ट किया जाएगा (उदाहरण में, यह
Yii::app()->user->returnUrl
)। यदि उपयोगकर्ता
No, thanks
क्लिक करता है, तो पॉपअप विंडो बस बंद हो जाएगी।
निष्कर्ष
यह सब है, प्राधिकरण प्रणाली काम करने के लिए तैयार है। आप एक्सटेंशन के साथ और क्या कर सकते हैं:
- प्रदाताओं की कक्षाओं का विस्तार करके उपयोगकर्ता के बारे में अतिरिक्त जानकारी प्राप्त करें। Vkontakte के माध्यम से प्राधिकरण के दौरान डेमो में एक उदाहरण देखा जा सकता है;
- एक्सटेंशन को yii-user के साथ एकीकृत करें। सामान्य तौर पर, उपयोगकर्ता को पंजीकृत करने के लिए, तालिका
{{users}}
: service
और identity
केवल दो फ़ील्ड जोड़ना पर्याप्त है। पहला क्षेत्र प्राधिकरण सेवा ( serviceName
संपत्ति) का नाम है। दूसरा इस सेवा ( id
संपत्ति) पर उपयोगकर्ता का विशिष्ट पहचानकर्ता है; - सामाजिक नेटवर्किंग एपीआई के साथ काम करने के लिए एक्सटेंशन का उपयोग करें।
संदर्भ
अद्यतन: आइटम "3.2 सेटिंग्स" में, लूप विस्तार की कमी थी, जोड़ा गया।
अद्यतन 2: वर्तमान संस्करण और सेटअप निर्देश
github.com पर उपलब्ध हैं। इस लेख में दिए गए निर्देश EAuth संस्करण <= 1.1.3 के लिए उपयुक्त हैं।
