एकाधिक सेवाओं के लिए समर्थन के साथ एकल उपयोगकर्ता प्राधिकरण

Yii इओथ विस्तार Yii ढांचे पर एक परियोजना को लागू करते समय, मुझे तृतीय-पक्ष सेवाओं (Google, फेसबुक, ट्विटर, आदि) के माध्यम से उपयोगकर्ताओं को पंजीकृत करने और अधिकृत करने का काम था।

इस समस्या के दो समाधान हैं:अद्यतन: वर्तमान संस्करण और सेटअप निर्देश github.com पर उपलब्ध हैं। इस लेख में दिए गए निर्देश EAuth संस्करण <= 1.1.3 के लिए उपयुक्त हैं।

प्राधिकरण सेवा का उपयोग करने के पेशेवरों:
  1. सादगी और स्थापना की गति;
  2. प्रत्येक प्रदाता के माध्यम से प्राधिकरण की पेचीदगियों को सीखने की आवश्यकता नहीं है।

हालाँकि, स्व-प्राधिकरण के कई अन्य फायदे हैं:
  1. प्राधिकरण प्रक्रिया पर पूर्ण नियंत्रण: प्रदाता प्राधिकरण विंडो में क्या लिखा जाएगा, हमें कौन सा डेटा प्राप्त होगा, आदि;
  2. साइट के डिजाइन के अनुसार प्राधिकरण विजेट की उपस्थिति को बदलने की क्षमता;
  3. जब OAuth के माध्यम से अधिकृत किया जाता है, तो प्रदाता द्वारा प्रदान किए जाने पर, एपीआई विधियों को कॉल करना संभव है;
  4. तृतीय-पक्ष सेवाओं पर कम निर्भरता - अधिक विश्वसनीयता।

मैंने मुख्य रूप से दूसरा विकल्प चुना क्योंकि yii के लिए कोई तैयार एक्सटेंशन नहीं थे, और मैं सोच रहा था कि इस तरह के प्राधिकरण सिस्टम अंदर से कैसे काम करते हैं। प्रारंभ में, यह एक उपयोगकर्ता प्रबंधन मॉड्यूल का हिस्सा था। लेकिन बाद में इस कार्यक्षमता को एक अलग विस्तार के रूप में आवंटित किया गया था, जिसे आसानी से किसी भी परियोजना में उपयोग किया जा सकता है।

1. प्राधिकरण प्रणाली के लिए आवश्यकताएँ


विस्तार को डिजाइन करते समय, मुझे निम्नलिखित सिद्धांतों द्वारा निर्देशित किया गया था:
  1. विभिन्न प्रकार की सेवाओं के माध्यम से प्राधिकरण की पेचीदगियों को अनदेखा करने की आवश्यकता, प्रत्येक सेवा के लिए एडेप्टर का उपयोग।
  2. एक अद्वितीय प्राधिकरण पहचानकर्ता प्राप्त करना जिसका उपयोग हमारे आवेदन में उपयोगकर्ता को पंजीकृत करने के लिए किया जा सकता है।
  3. उपयोगकर्ता की अतिरिक्त जानकारी प्राप्त करने के लिए मानक प्राधिकरण कक्षाओं का विस्तार करने की क्षमता।
  4. आवश्यक सेवा के प्राधिकरण वर्ग का विस्तार करके सामाजिक नेटवर्क के एपीआई के साथ काम करने की क्षमता।
  5. साइट द्वारा समर्थित सेवाओं की सूची को अनुकूलित करने की क्षमता, प्राधिकरण विजेट की उपस्थिति को फिर से परिभाषित करती है। हमारे आवेदन को बंद किए बिना प्राधिकरण के लिए पॉपअप विंडो का उपयोग करने की क्षमता।

2. EAuth विस्तार


उपरोक्त सभी आवश्यकताओं के कार्यान्वयन के परिणामस्वरूप, EAuth एक्सटेंशन का जन्म हुआ।
फिलहाल, विस्तार में शामिल हैं:

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, // Use the popup window instead of redirecting. 'services' => array( // You can change the providers and their classes. 'google' => array( 'class' => 'GoogleOpenIDService', ), 'yandex' => array( 'class' => 'YandexOpenIDService', ), 'twitter' => array( 'class' => 'TwitterOAuthService', 'key' => '...', 'secret' => '...', ), 'facebook' => array( 'class' => 'FacebookOAuthService', 'client_id' => '...', 'client_secret' => '...', ), 'vkontakte' => array( 'class' => 'VKontakteOAuthService', 'client_id' => '...', 'client_secret' => '...', ), 'mailru' => array( 'class' => 'MailruOAuthService', 'client_id' => '...', 'client_secret' => '...', ), ), ), ), 

विस्तार में केवल दो पैरामीटर हैं: popup और servicespopup पैरामीटर प्रदाता की साइट पर रीडायरेक्ट करने के बजाय, प्राधिकरण के लिए पॉपअप विंडो का उपयोग करने के लिए जिम्मेदार है। 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; /** * @var EAuthServiceBase the authorization service instance. */ protected $service; /** * Constructor. * @param EAuthServiceBase $service the authorization service instance. */ public function __construct($service) { $this->service = $service; } /** * Authenticates a user based on {@link username}. * This method is required by {@link IUserIdentity}. * @return boolean whether authentication succeeds. */ 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); //   if ($identity->authenticate()) { Yii::app()->user->login($identity); //     popup  $authIdentity->redirect(); } else { //  popup     cancelUrl $authIdentity->cancel(); } } // -   ,     $this->redirect(array('site/login')); } //   ... } 

सबसे पहले, हम चर $_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 क्लिक करता है, तो पॉपअप विंडो बस बंद हो जाएगी।

निष्कर्ष


यह सब है, प्राधिकरण प्रणाली काम करने के लिए तैयार है। आप एक्सटेंशन के साथ और क्या कर सकते हैं:

संदर्भ



अद्यतन: आइटम "3.2 सेटिंग्स" में, लूप विस्तार की कमी थी, जोड़ा गया।
अद्यतन 2: वर्तमान संस्करण और सेटअप निर्देश github.com पर उपलब्ध हैं। इस लेख में दिए गए निर्देश EAuth संस्करण <= 1.1.3 के लिए उपयुक्त हैं।

Source: https://habr.com/ru/post/In129804/


All Articles