Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Pastuh

Авторизация, регистрация и logout на самописном портале

Рекомендованные сообщения

Здравствуйте, у меня есть 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, как к ней подключится и как использовать ее. А далее я уже по аналогии смогу работать и с остальным.

 

Буду при много благодарен за любую помощь, а так же советы по моей просьбе\проблеме.

Поделиться сообщением


Ссылка на сообщение

Точно уже не помню вроде так у меня работало

 

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>";

 

ну и в форме входа должно быть поле в этим ключом тоже

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Это не совсем то, это использование ссылки самого форума, а не прямая работа с его функцией. Вот например как было сделано на 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.

Поделиться сообщением


Ссылка на сообщение

Дык, смотрите функцию "_doLogin" в /applications/core/modules/front/system/login.php и в класс \IPS\Login (/system/Login/Login.php), и пишете свою функцию для страницы портала, что мешает-то? Там тоже все доступно и не сложно.

 

Поэтому у меня большая просьба, не могли вы набросать небольшой пример для функции logout, как к ней подключится и как использовать ее. А далее я уже по аналогии смогу работать и с остальным.

Вечером попробуем пример сделать, если раньше никто не успеет.

Поделиться сообщением


Ссылка на сообщение

Если это портал для ипб который не имеет отдельной базы пользователей, почему бы не использовать стандартные страницы форума для авторизации и регистрации? Зачем придумывать костыли с апи и писать два раза одни и теже действия?

Поделиться сообщением


Ссылка на сообщение

Планируется добавлять дополнительные пункты и проверки для регистрации например. Саму регистрацию через ИПБ я отключу, ну точнее выпилю вообще эти кнопки. По факту этот портал будет как не часть форума, но и в тоже время нужно использовать именно через портал. Короче замутно. Разработка идет для онлайн игры и там много всяких условий и критериев от партнеров, которые необходимо реализовать, но в тоже время есть необходимость не переписывать функционал ИПБ, а его перенести и дописать.

Поделиться сообщением


Ссылка на сообщение

Вот ваш пример - myportal.zip

Распаковать в корень, перейти по ссылке http://mysite.moo/myportal/.

  • Upvote 2

Поделиться сообщением


Ссылка на сообщение
/*
* 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 ) );
}

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Спасибо, именно то что я искал.

Поделиться сообщением


Ссылка на сообщение

Решил не создавать новую тему а узнать в этой, так как вопрос связан.

 

Вот я подгружаю часть переменных из 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 и прекрасно там работает и выводит это злополучное название группы.

Поделиться сообщением


Ссылка на сообщение

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 );

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Спасибо помогло.

Поделиться сообщением


Ссылка на сообщение
Видел тему с перебором групп, но мне кажется это не совсем то что нужно, смысл это делать, когда вот это вот прописано в самом IPS и прекрасно там работает и выводит это злополучное название группы.

Видимо не разобрались. В моем коде нет ничего, что было бы связано с группой авторизованного пользователя. Там задача другая была - вывести все имеющиеся на форуме группы. Единственное, на что нужно было обратить внимание

\IPS\Member::loggedIn()->language()->parseOutputForDisplay( $groupsAsString );

 

Как можно это победить и вывести нормальное название?
После
$group_name = $member->groupName;

добавить

\IPS\Member::loggedIn()->language()->parseOutputForDisplay( $group_name );

Поделиться сообщением


Ссылка на сообщение
02/27/17 19:53 (изменено)

Здравствуйте.

Проблема с самописным сайтом и сквозной авторизацией.

На сайте

\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 только на сайте

 

Подскажите, пожалуйста, в какую сторону копать, а то голова уже квадратная....

Изменено пользователем alextix

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...