Перейти к контенту

Пароли в IPB 2.1.x, авторизация извне.


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

Как-то столкнулся с авторизацией на форуме извне, прочитал статью в документации на сайте и не шибко все понял.

Потом разобрался и оказалось все не так сложно.

 

Для авторизации нам нужно использовать такой запрос:

SELECT 
m.id, 
m.name,
m.members_display_name, 
mc.converge_email,
mc.converge_pass_hash,
mc.converge_pass_salt
FROM ibf_members m
JOIN ibf_members_converge mc ON (m.email = mc.converge_email)
WHERE m.id = [id_пользователя]
LIMIT 0, 1

если выборка идет по имени пользователя, то надо заменить блок WHERE на

WHERE m.name = [имя_пользователя]

Примечание: JOIN с ibf_members_converage идет не по id, по e-mail'у. это так, на будущее...

 

интересуют нас поля converge_pass_salt и converge_pass_hash, в них все и хранится.

 

а принцип сверки пароля такой:

md5( md5( converge_pass_salt ).md5( пароль_на_вводе ) ) == converge_pass_hash

 

если true то все хорошо, false — не прошло

 

вот и все :D

Изменено пользователем .silent
Ссылка на комментарий
Поделиться на других сайтах

  • Ответы 50
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

WHERE m.name = [имя_пользователя]

вот за такие советы надо просто руки оторвать.

Вот так ведь и напишут:

m.name={$_GET['name']}

Ссылка на комментарий
Поделиться на других сайтах

Ммм... А кто проще сможет?

 

<?php
require_once( './sources/api/api_core.php' ); 

$api = new api_core( );
$api->api_init( );

require_once( ROOT_PATH.'sources/handlers/han_login.php' );
$login		   =  new han_login();
$login->ipsclass =& $api->ipsclass;
$login->init(); 

/*
* Some checks for input data
*
* Password, Login
* 
* NEED TO BE PLACED HERE!
*/

// var $password contained plain-text password (not hash)!
$login->login_authenticate( $username, $password );

// check rest..
$member = $login->member; //member's data

if ( ( ! $member['id'] ) or ( $login->return_code == 'NO_USER' ) )
{
	// Ohh! Couldn't login. Some shit with user name.
	die( 'Hey! No user found' );
}

if ( $login->return_code != 'SUCCESS' )
{
	// Ohh! Couldn't login. Some shit happened. May be it's wrong password?
	die( 'Password wrong!');
} 

die( 'Hi, dude!');
?>

Ссылка на комментарий
Поделиться на других сайтах

Ваня, в твоём случае нужен дополнительный модуль.

А в варианте автора - только драйвер.

Ссылка на комментарий
Поделиться на других сайтах

han_login

api_core

 

согласен, в принципе они будут в любом случае

Ссылка на комментарий
Поделиться на других сайтах

WHERE m.name = [имя_пользователя]

вот за такие советы надо просто руки оторвать.

Вот так ведь и напишут:

m.name={$_GET['name']}

Song, ты не прав! Автор лишь показал методу (простенькую, но все же), а если пользователь сделает так

m.name={$_GET['name']}

то это чисто его проблемы, проблемы его рук и головы.

 

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

Ссылка на комментарий
Поделиться на других сайтах

могли бы сначала показать тему, а потом обсуждать.

а то уже всё обсудили =/

 

Ммм... А кто проще сможет?
а у кого быстрее отработает? :D

 

Song, руки отрывать мне не надо.

не нравится - не еште.

можете и топик удалить.

Ссылка на комментарий
Поделиться на других сайтах

а у кого быстрее отработает?

если всего один запрос и проверка то конечно же Ваше решение. НО!

 

Ваше решение не поддерживает механизмов аутентификации предложенных в IPB (internal/external/LDAP etc).

 

Более того в моем решение девелоперу совершенно не надо заморачиваться со структурой таблиц в БД, это решение буедт работоспособно при любых изменениях в структуре БД новых версий. А Ваше решение к сожалению придется переписывать, случись чего, согласитесь, это скучно -- программисты ленивые люди.

 

Так что скорость работы Вашего решения в данном случае это экономия на спичках.

Ссылка на комментарий
Поделиться на других сайтах

хорошо.

 

но для себя я лучше сделаю так чтобы работало побыстрее и перепишу если что :D

Ссылка на комментарий
Поделиться на других сайтах

Song, ты не прав! Автор лишь показал методу (простенькую, но все же), а если пользователь сделает так

Vicer, этот топик - информационный. Правильно?

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

Ссылка на комментарий
Поделиться на других сайтах

Song, ты не прав! Автор лишь показал методу (простенькую, но все же), а если пользователь сделает так

Vicer, этот топик - информационный. Правильно?

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

ну в таком случае в топике отсутствует код как таковой. Скажем так, это не претендует на готовое решение пока тут не будет рабочего кода, а пока это можно рассматривать как рассказ о схеме авторизации в теории.

Ссылка на комментарий
Поделиться на других сайтах

Song, юзер сохранит скрипт GiV'а и запустит его, потом скажет что нихрена не работает, да? :D

пошел такой пользователь к чертям.

Ссылка на комментарий
Поделиться на других сайтах

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>Тестирование авторизации</title>
</head>

<style>
html {overflow-x: auto; width:100%; height:100%; }
body {font-family: Tahoma; font-size: 8pt; margin: 5px; height:100%; background-color: #E2E8E7; }

form {display: inline; margin: 0; padding: 0; }
input, select, textarea {margin: 0; padding: 0; font-family: Tahoma; font-size: 8pt; }
</style>

<body>

<form method='post' action='login.php'">
<input type='text' name='UserName' value='' size='30' />
<input type='password' name='PassWord' size='30' /><br />
<br />
<input type='submit' value='проверить пользователя' />
</form>
<br />
<br />

<?
define( 'ROOT_PATH'  , "./" ); 		

require_once( ROOT_PATH.'sources/api/api_core.php' );

$api = new api_core( );
$api-> load_classes = array(
						'forums' => 1,
						'converge' => 1); 	// грузимся чуть быстрее чем по-умолчанию
$api->api_init( );

require_once( ROOT_PATH.'sources/handlers/han_login.php' );
$login		   =  new han_login();
$login->ipsclass =& $api->ipsclass;
$login->init();

$userName = $api->ipsclass->input['UserName'];
$password = $api->ipsclass->input['PassWord'];		

if ( isset( $userName ) )
{
	$success = true;
	$login->login_authenticate( $userName, $password );

	$member = $login->member;

	if ( ( ! $member['id'] ) or ( $login->return_code == 'NO_USER' ) )
	{
		echo( 'Пользователь не найден' );
		$success = false;
	}

	if ( $success and $login->return_code != 'SUCCESS' )
	{
		echo( 'Пароль не верен!');
		$success = false;
	}

	if ( $success )
		echo( 'Успешная авторизация' );
}
?>
</body>

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Хм два вопроса:

 

1. Как сделать чтобы он действительно вошёл в систему. Т.е. сайт использовал систему авторизации сайта. Пока вижу выход переотправлять пользователя на index.php?act=login или отправлять форму в скрипт. Но хотелось бы чтобы выполнив вход, посетителя не кидало на форум, а обратно, хотябы на главную страницу сайта.

 

2.Вопрос сегодня же решил

Вот код скрипта, переделанного

 

require "Url/to/forum/"."init.php";   //вместо Url/to/forum/ ставим относительный путь к папке с форумом
require ROOT_PATH."ips_kernel/class_db_mysql.php";
require ROOT_PATH."conf_global.php";
require_once ROOT_PATH."sources/ipsclass.php";
require_once ROOT_PATH."sources/classes/class_session.php";

$ipsclass	   = new ipsclass();
$ipsclass->vars = $INFO;

$ipsclass->init_db_connection();


$ipsclass->sess			 =  new session();
$ipsclass->sess->ipsclass   =& $ipsclass;

$ipsclass->member	 = $ipsclass->sess->authorise();
$ipsclass->my_session = $ipsclass->sess->session_id; // Used in code

 

После этих действий доступно $ipsclass->members и можно без проблем узнать, выполнил человек вход или нет.

Ссылка на комментарий
Поделиться на других сайтах

Для логина есть хороший параметр return.

В login.php

		if ( $this->ipsclass->input['return'] != "" )
	{
		$return = urldecode($this->ipsclass->input['return']);

		if ( preg_match( "#^http://#", $return ) )
		{
			$this->ipsclass->boink_it($return);
		}
	}

собственно...

Ссылка на комментарий
Поделиться на других сайтах

  • 5 месяцев спустя...
Ну а как установить Куки, чтобы пользователь не только проверился, существует ли он, а полностью авторизовался на форуме?
Ссылка на комментарий
Поделиться на других сайтах

  • 4 недели спустя...
Ну а как установить Куки, чтобы пользователь не только проверился, существует ли он, а полностью авторизовался на форуме?

Посмотри мой пример, вполне рабочий. Отправляй форму входа на скрипт аутентификации, там пропиши редирект и всё будет работать.

 

P.S. Я егно доработал, так что работает а автовход и т.д..... куки создаются....

 

 
require "forum/"."init.php";   //вместо Url/to/forum/ ставим относительный путь к папке с форумом
require ROOT_PATH."ips_kernel/class_db_mysql.php";
require ROOT_PATH."conf_global.php";
require_once ROOT_PATH."sources/ipsclass.php";
require_once ROOT_PATH."sources/classes/class_session.php";

$ipsclass	   = new ipsclass();
$ipsclass->vars = $INFO;

$ipsclass->init_db_connection();


$ipsclass->sess			 =  new session(); 
$ipsclass->sess->ipsclass   =& $ipsclass;

$ipsclass->init_load_cache();
$ipsclass->initiate_ipsclass();

$ipsclass->member	 = $ipsclass->sess->authorise();
$ipsclass->my_session = $ipsclass->sess->session_id;

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

Ну а как установить Куки, чтобы пользователь не только проверился, существует ли он, а полностью авторизовался на форуме?

Посмотри мой пример, вполне рабочий. Отправляй форму входа на скрипт аутентификации, там пропиши редирект и всё будет работать.

 

P.S. Я егно доработал, так что работает а автовход и т.д..... куки создаются....

 

 
require "forum/"."init.php";   //вместо Url/to/forum/ ставим относительный путь к папке с форумом
require ROOT_PATH."ips_kernel/class_db_mysql.php";
require ROOT_PATH."conf_global.php";
require_once ROOT_PATH."sources/ipsclass.php";
require_once ROOT_PATH."sources/classes/class_session.php";

$ipsclass	   = new ipsclass();
$ipsclass->vars = $INFO;

$ipsclass->init_db_connection();


$ipsclass->sess			 =  new session(); 
$ipsclass->sess->ipsclass   =& $ipsclass;

$ipsclass->init_load_cache();
$ipsclass->initiate_ipsclass();

$ipsclass->member	 = $ipsclass->sess->authorise();
$ipsclass->my_session = $ipsclass->sess->session_id;

 

А куда этот куд вставляется.

Код .silent использую. Вижу, что "залогинился". Но на форуме то ничего не происходит.

Как я понимаю, код выше как раз и должен эту функцию выполнять?

Ссылка на комментарий
Поделиться на других сайтах

Да.. Я у себя делаю так:

 

Пишу блок инициализации init.php, где расположен данный код.

 

Потом скажем index.php выглядит так:

<?
include('init.php');

 /*  тело index.php */
?>

 

Единственное, дабы исключить повторные подключения к базе данных тебе надо будет использовать класс базы форума(кстати вполне удобно)

 

Если тебя это не устраивает, то ты можешь сделать следующее:

 

Если нужно выцепить сессию, подключаешь как выше описано, форум, делаешь дамп необходимой информации в свою базу, (при этом создаются соответсвующие кукисы), затем уже своим скриптом, согласном кукам, из своей базы выдираешь сессию, либо указатель на нужную таблицу, смотря как сделаешь дамп...

 

Good Luck!

Ссылка на комментарий
Поделиться на других сайтах

Написал такой myinit.php (лежит в папке форума):

<?
require "init.php";
require ROOT_PATH."ips_kernel/class_db_mysql.php";
require ROOT_PATH."conf_global.php";
require_once ROOT_PATH."sources/ipsclass.php";
require_once ROOT_PATH."sources/classes/class_session.php";

$ipsclass	   = new ipsclass();
$ipsclass->vars = $INFO;

$ipsclass->init_db_connection();


$ipsclass->sess			 =  new session();
$ipsclass->sess->ipsclass   =& $ipsclass;

$ipsclass->init_load_cache();
$ipsclass->initiate_ipsclass();

$ipsclass->member	 = $ipsclass->sess->authorise();
$ipsclass->my_session = $ipsclass->sess->session_id; 
?>

 

Файл login.php (тоже лежит в папке форума):

<?
include('myinit.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>Тестирование авторизации</title>
</head>

<style>
html {overflow-x: auto; width:100%; height:100%; }
body {font-family: Tahoma; font-size: 8pt; margin: 5px; height:100%; background-color: #E2E8E7; }

form {display: inline; margin: 0; padding: 0; }
input, select, textarea {margin: 0; padding: 0; font-family: Tahoma; font-size: 8pt; }
</style>

<body>

<form method='post' action='login.php'">
<input type='text' name='UserName' value='' size='30' />
<input type='password' name='PassWord' size='30' /><br />
<br />
<input type='submit' value='проверить пользователя' />
</form>
<br />
<br />

<?
define( 'ROOT_PATH'  , "./" );		 

require_once( ROOT_PATH.'sources/api/api_core.php' );

$api = new api_core( );
$api-> load_classes = array(
						'forums' => 1,
						'converge' => 1);	 // грузимся чуть быстрее чем по-умолчанию
$api->api_init( );

require_once( ROOT_PATH.'sources/handlers/han_login.php' );
$login		   =  new han_login();
$login->ipsclass =& $api->ipsclass;
$login->init();

$userName = $api->ipsclass->input['UserName'];
$password = $api->ipsclass->input['PassWord'];		

if ( isset( $userName ) )
{
	$success = true;
	$login->login_authenticate( $userName, $password );

	$member = $login->member;

	if ( ( ! $member['id'] ) or ( $login->return_code == 'NO_USER' ) )
	{
		echo( 'Пользователь не найден' );
		$success = false;
	}

	if ( $success and $login->return_code != 'SUCCESS' )
	{
		echo( 'Пароль не верен!');
		$success = false;
	}

	if ( $success )
		echo( 'Успешная авторизация' );
}
?>
</body>

 

В результате запуска login.php:

Notice: Use of undefined constant IPB_THIS_SCRIPT - assumed 'IPB_THIS_SCRIPT' in \init.php on line 56

Fatal error: Call to a member function on a non-object in \sources\handlers\han_login.php on line 62

 

Без include('myinit.php'); этих предупреждения и ошибки нет.

Авторизация тоже не работает.

Что не так нписал?

Ссылка на комментарий
Поделиться на других сайтах

дело в том что, учитывая, что ты соединил два примера, то PHP ругается на то, что классы объявляются несколько раз вроде как...

 

Завтра выложу архив, разберешься.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...

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

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.