Pastuh Posted March 1, 2016 Share Posted March 1, 2016 Здравствуйте, у меня есть IPB 3.4.6 версии на котором я занимался разработкой, но сейчас встала нужда приобрести лицензию и установить IPS 4. Что мне необходимо:Есть самописный портал для IPB 3.4.х версии, его нужно подключить к IPS 4. Я использовал функции из этого топика http://ipbskins.ru/forum/topic6401.html все прекрасно работало, но они полностью не подходят для IPS 4. Я провел несколько дней в поисках реализации того же на более новой версии, нашел IPS Connect который уже встроенный, и делает в принципе тоже самое, что и эти функции. Но там требуется как то подключать секретный ключ, с этим я вообще не разобрался, на самом деле я так понял, что это для связки отдельных сайтов. Поэтому это не много не тот вариант который мне нужен, меня интересует работа напрямую на том же домене и можно сказать почти в той же директории что и форум. Так же я нашел в /applications/core/modules/front/system/login.php функции _doLogin и logout которые как раз мне нужны. Я пробовал подключать их как указано в этой теме: http://ipbskins.ru/forum/topic14284.html Но к сожалению я получаю 500 ошибок и ничего не происходит, то есть вызов этих функций не происходит, а вот если выводить данные как указано в примере из топика, то все отлично работает. Но мне нужна работа с этими функциями. Поэтому у меня большая просьба, не могли вы набросать небольшой пример для функции logout, как к ней подключится и как использовать ее. А далее я уже по аналогии смогу работать и с остальным. Буду при много благодарен за любую помощь, а так же советы по моей просьбе\проблеме. Link to comment Share on other sites More sharing options...
avgaz Posted March 1, 2016 Share Posted March 1, 2016 Точно уже не помню вроде так у меня работало require_once('init.php'); \IPS\Dispatcher\Front::i(); //$member = \IPS\Member::loggedIn(); $logout = \IPS\Session::i()->csrfKey; echo "<a href="/forum/logout/?csrfKey={$logout}">Выход</a>"; ну и в форме входа должно быть поле в этим ключом тоже 1 Link to comment Share on other sites More sharing options...
Pastuh Posted March 2, 2016 Author Share Posted March 2, 2016 Это не совсем то, это использование ссылки самого форума, а не прямая работа с его функцией. Вот например как было сделано на 3.4.6 require_once( FORUM_PATH . 'admin/api/member/api_member_login.php' ); $apiMember = new apiMemberLogin(); $apiMember->init(); if( $_GET['do'] == 'logout' ) { $apiMember->logout(); header('Location: http://'.$_SERVER['HTTP_HOST'].'/index.php'); exit; } То есть при вызове http://site.ru/?do=logout я получу полноценный выход с ipb и с портала.Как видим был вызван класс apiMemberLogin(), и выполнена его функция logout(), которая сама подцепилась к функциям IPB и выполнила все необходимые процедуры. Хотя есть и вариант как написали вы, через ссылку с указанием ключа сессии. Но больше интересует вариант с использованием функции. Потому что например вот авторизация через это: require_once( FORUM_PATH . 'admin/api/member/api_member_login.php' ); $apiMember = new apiMemberLogin(); $apiMember->init(); if ($_GET['do'] == 'ips_username') { $ips_username = $_POST['ips_username']; $ips_password = $_POST['ips_password']; login_ipb($ips_username,$ips_password); } function login_ipb($ips_username,$ips_password) { global $apiMember; $ret = $apiMember->login( $ips_username, $ips_password ); $result = $ret[2]; if (empty($result)) { header('Location: http://'.$_SERVER['HTTP_HOST'].'/index.php'); } else { header('Location: http://'.$_SERVER['HTTP_HOST'].'/?go=login&error='.$result); } } Как говорится все просто и доступно и на IPB нас не кидает, все происходит на портале. Меня интересует тоже самое но на IPS 4. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted March 2, 2016 Share Posted March 2, 2016 Дык, смотрите функцию "_doLogin" в /applications/core/modules/front/system/login.php и в класс \IPS\Login (/system/Login/Login.php), и пишете свою функцию для страницы портала, что мешает-то? Там тоже все доступно и не сложно. Поэтому у меня большая просьба, не могли вы набросать небольшой пример для функции logout, как к ней подключится и как использовать ее. А далее я уже по аналогии смогу работать и с остальным.Вечером попробуем пример сделать, если раньше никто не успеет. Link to comment Share on other sites More sharing options...
siv1987 Posted March 2, 2016 Share Posted March 2, 2016 Если это портал для ипб который не имеет отдельной базы пользователей, почему бы не использовать стандартные страницы форума для авторизации и регистрации? Зачем придумывать костыли с апи и писать два раза одни и теже действия? Link to comment Share on other sites More sharing options...
Pastuh Posted March 2, 2016 Author Share Posted March 2, 2016 Планируется добавлять дополнительные пункты и проверки для регистрации например. Саму регистрацию через ИПБ я отключу, ну точнее выпилю вообще эти кнопки. По факту этот портал будет как не часть форума, но и в тоже время нужно использовать именно через портал. Короче замутно. Разработка идет для онлайн игры и там много всяких условий и критериев от партнеров, которые необходимо реализовать, но в тоже время есть необходимость не переписывать функционал ИПБ, а его перенести и дописать. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted March 2, 2016 Share Posted March 2, 2016 Вот ваш пример - myportal.zipРаспаковать в корень, перейти по ссылке http://mysite.moo/myportal/. 2 Link to comment Share on other sites More sharing options...
siv1987 Posted March 4, 2016 Share Posted March 4, 2016 /* * Authorization * @return \IPS\Member|false */ function doLogin( $username, $password, $rememberMe=true, $anonymous=false ) { $login = new \IPS\Login( \IPS\Http\Url::internal('') ); $login->forms(); try{ $member = $login->authenticateStandard(array( 'auth' => $username, 'password' => $password, )); } catch( \IPS\Login\Exception $e ) { return false; } if ( $anonymous and !\IPS\Settings::i()->disable_anonymous ) { \IPS\Session::i()->setAnon(); \IPS\Request::i()->setCookie( 'anon_login', 1 ); } \IPS\Session::i()->setMember( $member ); if ( $rememberMe ) { $expire = new \IPS\DateTime; $expire->add( new \DateInterval( 'P7D' ) ); \IPS\Request::i()->setCookie( 'member_id', $member->member_id, $expire ); \IPS\Request::i()->setCookie( 'pass_hash', $member->member_login_key, $expire ); if ( $anonymous and !\IPS\Settings::i()->disable_anonymous ) { \IPS\Request::i()->setCookie( 'anon_login', 1, $expire ); } } $member->memberSync( 'onLogin', array( \IPS\Login::getDestination() ) ); return $member; } /* * Logout * @return void */ function logout() { $redirectUrl = \IPS\Http\Url::internal( '' ); $member = \IPS\Member::loggedIn(); /* Are we logging out back to an admin user? */ if( isset( $_SESSION['logged_in_as_key'] ) ) { $key = $_SESSION['logged_in_as_key']; unset( \IPS\Data\Store::i()->$key ); unset( $_SESSION['logged_in_as_key'] ); unset( $_SESSION['logged_in_from'] ); return; } \IPS\Request::i()->setCookie( 'member_id', NULL ); \IPS\Request::i()->setCookie( 'pass_hash', NULL ); \IPS\Request::i()->setCookie( 'anon_login', NULL ); foreach( \IPS\Request::i()->cookie as $name => $value ) { if( mb_strpos( $name, "ipbforumpass_" ) !== FALSE ) { \IPS\Request::i()->setCookie( $name, NULL ); } } session_destroy(); /* Login handler callback */ foreach ( \IPS\Login::handlers( TRUE ) as $k => $handler ) { try { $handler->logoutAccount( $member, $redirectUrl ); } catch( \BadMethodCallException $e ) {} } /* Member sync callback */ $member->memberSync( 'onLogout', array( $redirectUrl ) ); } 1 Link to comment Share on other sites More sharing options...
Pastuh Posted March 5, 2016 Author Share Posted March 5, 2016 Спасибо, именно то что я искал. Link to comment Share on other sites More sharing options...
Pastuh Posted March 9, 2016 Author Share Posted March 9, 2016 Решил не создавать новую тему а узнать в этой, так как вопрос связан. Вот я подгружаю часть переменных из IPS: //\IPS\Dispatcher\Front::i(); \IPS\Dispatcher\Build::i(); $lang = \IPS\Lang::load( \IPS\Lang::defaultLanguage() ); $member = \IPS\Member::loggedIn(); $name = $member->name; $member_id = $member->member_id; $photo = $member->photo; $group_id = $member->member_group_id; $group_name = $member->groupName; Все выводится нормально, но когда пытаюсь вывести $group_name, получаю вот такую белеберду - <span style="color:#ff0000">5f89b7d227f657c81a6ade13afb30149</span>.Как бы я думаю видно, что он поймал группу администратора и подгрузил даже его цвет. Но как бы само название у нас чем то шифруется. При обновление страницы сам код 5f89b7d227f657c81a6ade13afb30149 меняется. Как можно это победить и вывести нормальное название? На деле испробовал много вариантов. Сейчас стоит вывод вместе с formatName, без него такая же билеберда, только вот уже span и цвет не задается. Уже голову сломал.. В чем может быть проблема? Видел тему с перебором групп, но мне кажется это не совсем то что нужно, смысл это делать, когда вот это вот прописано в самом IPS и прекрасно там работает и выводит это злополучное название группы. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted March 9, 2016 Share Posted March 9, 2016 http://ipbskins.ru/forum/topic14284.html#entry95710 P.S. В вашем случае:$g_name = \IPS\Member::loggedIn()->get_groupName(); \IPS\Member::loggedIn()->language()->parseOutputForDisplay( $g_name ); var_dump( $g_name ); 1 Link to comment Share on other sites More sharing options...
Pastuh Posted March 9, 2016 Author Share Posted March 9, 2016 Спасибо помогло. Link to comment Share on other sites More sharing options...
newbie Posted March 10, 2016 Share Posted March 10, 2016 Видел тему с перебором групп, но мне кажется это не совсем то что нужно, смысл это делать, когда вот это вот прописано в самом IPS и прекрасно там работает и выводит это злополучное название группы.Видимо не разобрались. В моем коде нет ничего, что было бы связано с группой авторизованного пользователя. Там задача другая была - вывести все имеющиеся на форуме группы. Единственное, на что нужно было обратить внимание \IPS\Member::loggedIn()->language()->parseOutputForDisplay( $groupsAsString ); Как можно это победить и вывести нормальное название?После $group_name = $member->groupName; добавить \IPS\Member::loggedIn()->language()->parseOutputForDisplay( $group_name ); Link to comment Share on other sites More sharing options...
alextix Posted February 27, 2017 Share Posted February 27, 2017 (edited) Здравствуйте.Проблема с самописным сайтом и сквозной авторизацией.На сайте\IPS\Dispatcher\Front::i(); $csrfKey = \IPS\Session::i()->csrfKey;отличается от csrfKey на форуме/forum/index.php?/logout/&csrfKey= Когда использую function logout() из поста выше,то logout только из форума, если же в function logout()прописываю \IPS\Dispatcher\Front::i(),то logout только на сайте Подскажите, пожалуйста, в какую сторону копать, а то голова уже квадратная.... Edited February 27, 2017 by alextix Link to comment Share on other sites More sharing options...
Dmitriy427 Posted July 31, 2017 Share Posted July 31, 2017 http://ipbskins.ru/forum/topic14284.html/page__view__findpost__p__101008 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now