Jump to content

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


Pastuh
 Share

Recommended Posts

Здравствуйте, у меня есть 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

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

 

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
Link to comment
Share on other sites

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

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

 

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

/*
* 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
Link to comment
Share on other sites

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

 

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

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

  • 11 months later...

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

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

На сайте

\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 by alextix
Link to comment
Share on other sites

  • 5 months later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...