UMI.CMSのHybridAuth。 UMI.CMSのソーシャルネットワークを介した承認

非常に長い間、私はloginzaとは異なるUMIのスクリプトを作成したかったのです。それは、いくつかの理由で(完全に主観的な)完全には成功していないと思うからです。 もしそうなら、石を投げないでください。



habrahabrに関する記事の1つに触発されましたが、残念ながらその記事は削除されました。 いずれにせよ、 この記事ですべての消防士へのリンクを残します。 この記事では、HybridAuthをサイトに接続する方法を一般的に説明し、メソッドを実装して記事を書く準備ができています。



人気のあるHybridAuthライブラリを介してUMI.CMSでの認可の実装を検討します。



UMI.CMSの承認は、プロバイダーを通じて実装されます。







UMI.CMSのHybridAuthの記事は、いくつかの記事に分かれます。

1)ユーザーフィールドのカスタマイズ

2)HybridAuthをインストールして構成する

3)HybridAuth + UMI.CMSスクリプトをインストールします

4)テンプレート調整



ユーザーフィールドのカスタマイズ



まず、データテンプレート(モジュール)に移動して、「ユーザー」データタイプを見つけます。

hybridauth-dlya-umi-cms-3



新しいフィールド「アバター」と「ソーシャルからのユーザーID」を追加します。 ネットワーク」:



hybridauth-dlya-umi-cms-4



hybridauth-dlya-umi-cms-5



hybridauth-dlya-umi-cms-6



ユーザーのセットアップが完了しました。



HybridAuthをインストールして構成する



ここからライブラリをダウンロードできます(これらは元のファイルです)。 ここに追加します。 プロバイダー。 このリンクは、vk.comが既に追加されている状態でダウンロードできます(このアーカイブの使用をお勧めします)。



まず、サイト用のアプリケーションを作成する必要があります。 アプリケーションの作成プロセスについては説明しませんが、自分でそれを理解できると確信しています。 より速く理解するために、アプリケーションの作成へのリンクを提供します。





次に、HybridAuthを構成する必要があります。 これを行うには、_http://your_site/hybridauth/install.phpを開き、必要なサービスを選択します。 hybridauthを開発した人たちがすぐにアプリケーションの作成へのリンクを提供したという事実に注目したいと思います。



すべての設定を行って保存すると、次のように表示されます。



hybridauth-dlya-umi-cms-2



ここで、新しいプロバイダーを追加する必要があります。



リポジトリから元のファイルを使用した場合は、vk.comのプロバイダーをインストールする必要があります(完成したアーカイブを取得した場合は、vk.comのセットアップをスキップしてください)。 このリンクに従ってファイルをダウンロードしてください。 \ hybridauth \ Hybrid \ Providersディレクトリに配置する必要があります。 hybridauth \ config.phpファイルにコードを追加し、VKontakteが提供するIDとシークレットを入力します。



"Vkontakte" => array ( "enabled" => true, "keys" => array ( "id" => "", "secret" => "" ) ),
      
      







HybridAuth + UMI.CMSスクリプトのインストール



次に、次の内容のauth_with_social.phpファイルをルートに配置する必要があります。



 session_start(); require_once('standalone.php'); $config = CURRENT_WORKING_DIR . '/hybridauth/config.php'; require CURRENT_WORKING_DIR . '/hybridauth/Hybrid/Auth.php'; $domain = cmsController::getInstance()->getCurrentDomain()->getHost(); //   $users = cmsController::getInstance()->getModule("users"); // ""   users $data = cmsController::getInstance()->getModule("data"); // ""   data /* * /auth_with_social.php?login_with=_fb * /auth_with_social.php?login_with=_vk * /auth_with_social.php?login_with=_in * /auth_with_social.php?login_with=_gp * /auth_with_social.php?login_with=_tw * */ if( isset( $_GET["login_with"] ) ) { $login_with = $_GET["login_with"]; try { $hybridauth = new Hybrid_Auth($config); $adapter = false; switch ($login_with) { case "_fb": $adapter = $hybridauth->authenticate( "facebook" ); break; case "_vk": $adapter = $hybridauth->authenticate( "vkontakte" ); break; case "_in": $adapter = $hybridauth->authenticate( "linkedin" ); break; case "_gp": $adapter = $hybridauth->authenticate( "google" ); break; case "_tw": $adapter = $hybridauth->authenticate( "twitter" ); break; } //     ""   if(!$adapter) die( "<b>  !   .</b> "); $profile = $adapter->getUserProfile(); //     -  if( !isset( $profile ) ){ /*  $profile   auth_with_social.php   */ $domain = cmsController::getInstance()->getCurrentDomain()->getHost(); header ("Location: http://" . $domain); //   ,   :) } else { echo " "; echo "<pre>"; print_r($profile); echo "</pre>"; $objectTypes = umiObjectTypesCollection::getInstance(); $objectTypeId = $objectTypes->getBaseType("users", "user"); $objectType = $objectTypes->getType($objectTypeId); $provider = $login_with; //      $identifier = $profile->identifier; $login = $profile->email; $email = $profile->email; if(iconv_strlen($login) == 0) { $login = transliterate($profile->firstName); $login .= $profile->identifier; $email = $login . '@'. $domain; } $fname = $profile->firstName; $lname = $profile->lastName; $password = md5(generate_password(10)); $sel = new selector('objects'); $sel->types('object-type')->name('users', 'user'); $sel->where('e-mail')->equals($email); $user = $sel->first; if( $user instanceof iUmiObject ) { permissionsCollection::getInstance()->loginAsUser($user); session_commit(); header ("Location: http://" . $domain); } else { if(!preg_match("/.+@.+\..+/", $email)) { while(true) { $email = $login.rand(1,100)."@".getServer('HTTP_HOST'); if($this->checkIsUniqueEmail($email)) { break; } } } $object_id = umiObjectsCollection::getInstance()->addObject($login, $objectTypeId); $object = umiObjectsCollection::getInstance()->getObject($object_id); $object->setValue("login", $login); $object->setValue("password", md5($password)); $object->setValue("e-mail", $email); $object->setValue("fname", ($fname)); $object->setValue("lname", $lname); $object->setValue("loginza", $provider); $object->setValue("social_identifier", $identifier); $object->setValue("register_date", time()); $object->setValue("is_activated", '1'); $object->setValue("activate_code", md5(uniqid(rand(), true))); /*    */ $user_pic = "./files/users_upload/social_avatars/"; $user_pic .= $identifier . $provider; $png_pos = strpos($profile->photoURL , '.png'); $gif_pos = strpos($profile->photoURL , '.gif'); if ( $png_pos !== false ) $user_pic .= ".png"; elseif ( $gif_pos !== false ) $user_pic .= ".gif"; else $user_pic .= ".jpeg"; // How to save facebook profile picture using php graph Api // http://goo.gl/zgL3iR //     URL- // http://goo.gl/VHeXk1 $data = file_get_contents($profile->photoURL); $file = fopen($user_pic, 'wb'); fputs($file, $data); fclose($file); if( file_exists("$user_pic") ) { $oFile = new umiFile($user_pic); if (!$oFile->getIsBroken()) { $object->setValue("avatar", $oFile); } } /* //    */ $_SESSION['cms_login'] = $login; $_SESSION['cms_pass'] = md5($password); $_SESSION['user_id'] = $object_id; session_commit(); $group_id = regedit::getInstance()->getVal("//modules/users/def_group"); $object->setValue("groups", Array($group_id)); $data_module = cmsController::getInstance()->getModule('data'); $data_module->saveEditedObject($object_id, true); $object->commit(); header ("Location: http://" . $domain); } } } catch( Exception $e ) { /*$html = "  .    : "; $html .= "<b>" . $e->getMessage() . "</b>"; die( $html );*/ header ("Location: http://" . $domain . '/authorization/?error=' . $e->getMessage()); } } else { /*     auth_with_social.php   */ header ("Location: http://" . $domain); } /* *   * */ function generate_password($number) { $arr = array('a','b','c','d','e','f', 'g','h','i','j','k','l', 'm','n','o','p','r','s', 't','u','v','x','y','z', 'A','B','C','D','E','F', 'G','H','I','J','K','L', 'M','N','O','P','R','S', 'T','U','V','X','Y','Z', '1','2','3','4','5','6', '7','8','9','0','-'); //   $pass = ""; for($i = 0; $i < $number; $i++) { //     $index = rand(0, count($arr) - 1); $pass .= $arr[$index]; } return $pass; } /* *    * */ function transliterate($input) { $gost = array( "Є"=>"YE","І"=>"I","Ѓ"=>"G","і"=>"i","№"=>"-","є"=>"ye","ѓ"=>"g", ""=>"A",""=>"B",""=>"V",""=>"G",""=>"D", ""=>"E",""=>"YO",""=>"ZH", ""=>"Z",""=>"I",""=>"J",""=>"K",""=>"L", ""=>"M",""=>"N",""=>"O",""=>"P",""=>"R", ""=>"S",""=>"T",""=>"U",""=>"F",""=>"Kh", ""=>"C",""=>"CH",""=>"SH",""=>"SHH",""=>"'", ""=>"Y",""=>"",""=>"E",""=>"YU",""=>"YA", ""=>"a",""=>"b",""=>"v",""=>"g",""=>"d", ""=>"e",""=>"yo",""=>"zh", ""=>"z",""=>"i",""=>"j",""=>"k",""=>"l", ""=>"m",""=>"n",""=>"o",""=>"p",""=>"r", ""=>"s",""=>"t",""=>"u",""=>"f",""=>"kh", ""=>"c",""=>"ch",""=>"sh",""=>"shh",""=>"", ""=>"y",""=>"",""=>"e",""=>"yu",""=>"ya", " "=>"-","—"=>"-",","=>"-","!"=>"-","@"=>"-", "#"=>"-","$"=>"","%"=>"","^"=>"","&"=>"","*"=>"", "("=>"",")"=>"","+"=>"","="=>"",";"=>"",":"=>"", "'"=>"","\""=>"","~"=>"","`"=>"","?"=>"","/"=>"", "\\"=>"","["=>"","]"=>"","{"=>"","}"=>"","|"=>"", "."=>"-" ); $string = strtr($input, $gost); return strtolower($string); }
      
      







次に、.htaccessファイルに次の行を追加します。

 ###### SOCIAL ##### RewriteRule ^hybridauth/(.*)*$ hybridauth/index.php?%{QUERY_STRING} [L] ###### // SOCIAL #####
      
      







テンプレート調整



次に、ソーシャルを介した承認のためにテンプレートにリンクを追加する必要があります。 ネットワーク。 このコードを取得する必要があります。



 <ul class="b-social-links"> <li class="b-social-links__item"> <a href="/auth_with_social.php?login_with=_fb" class="fb" title="  Facebook">  Facebook</a> </li> <li class="b-social-links__item"> <a href="/auth_with_social.php?login_with=_vk" class="vk" title="  ">  </a> </li> <li class="b-social-links__item"> <a href="/auth_with_social.php?login_with=_in" class="in" title="  LinkedIn">  LinkedIn</a> </li> <li class="b-social-links__item"> <a href="/auth_with_social.php?login_with=_gp" class="gp" title="  Google+">  Google+</a> </li> <li class="b-social-links__item"> <a href="/auth_with_social.php?login_with=_tw" class="tw" title="  Twitter">  Twitter</a> </li> </ul>
      
      







セットアップはこれですべてです。



ここで、認証中にエラーが発生した場合に注意を払いたいと思います。 これが発生した場合、スクリプトはgetパラメータエラーでページ/ authorization /にリダイレクトします。



ユーザーエラーを表示するには、サイト構造内にページを作成し、そのURL / authorization /を作成する必要があります。 次に、xsltを使用してエラーパラメーターを解決します。 TPLテンプレート言語は考慮しません。



参照:





PS質問や理解できない瞬間がある場合は、コメントを書いてください。

PSS間違いを見つけたら、私に知らせてください、私はすぐにそれを修正します。 私は自分の経験をすばやく共有しようとしました。おそらく誰かが役に立つでしょう。



ご清聴ありがとうございました。



All Articles