Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

Дизайн и модификация Invision Community

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

Авторизация, регистрация и 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>";

 

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

  • Автор

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

/*
* 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 ) );
}

  • Автор

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

  • Автор

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

 

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

  • Автор

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

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

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

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

 

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

добавить

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

  • 11 месяцев спустя...

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

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

На сайте

\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

  • 5 месяцев спустя...
  • 6 месяцев спустя...

Подскажите пожалуйста, как таким способом получать вот это:

 

$ret = $apiMember->login( $ips_username, $ips_password );

$result = $ret[2];

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.