Собственно всё. Теперь мы имеем систему, благодаря которой уже зарегистрированные пользователи, при первом входе заведут себе новый аккаунт на форуме. По какому критерию их сравнивать (логин, почта) это уже решайте сами. Естественно нужно еще дописать функии, которые при регистрации пользователей будут создавать учетную запись на форуме. И чтобы при авторизации несуществующего пользователя на сайте, при правильном форумном логине и пароле, ему автоматически создавалась учетная запись на сайте.
- 1. Пользователь заполняет на сайте поля login и password
2. Проверяем, заполненно ли у предпологаемого пользователя поле user_f_id- Если заполнено, то:
1. Запускаем функцию авторизации пользователя через форумную БД (листинг ниже)
2. Если пароль не подходит, то выходим. Если подходит, то ставим авторизию на сайте + авторизацию на форуме
3. Авторизация на форуме делается путем установки кук + добавлением записи в таблицу %prefix%_sessions БД форума (листинг ниже)- Если не заполнено, то:
1. Скрипт производит стандартные функции валидации пароля
2. Если пароль не подходит, то выходим, если подходит, то запускаем функции установки сопоставления
3. Создаем запись в БД форума о пользователе (таблица %prefix%_users)
4. Созадем запись в БД форума о правах пользователя (таблица %prefix%_user_group)
5. Заполняем в БД нашего сайта поле user_f_id
Листинг ф-ций, которые проверяют пароль из форумной базы:
Код: Выделить всё
// phpbb_hash($password) - Создание пароля
// phpbb_check_hash($password, $hash) - Верификация пароля
function unique_id()
{
return substr(md5(rand().'_'.microtime().'_'.rand()), rand(0, 15), 16);
}
function _hash_gensalt_private($input, &$itoa64, $iteration_count_log2 = 6)
{
if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
{
$iteration_count_log2 = 8;
}
$output = '$H$';
$output .= $itoa64[min($iteration_count_log2 + ((PHP_VERSION >= 5) ? 5 : 3), 30)];
$output .= $_hash_encode64($input, 6, $itoa64); return $output;
}
function _hash_encode64($input, $count, &$itoa64)
{
$output = '';
$i = 0;
do
{
$value = ord($input[$i++]);
$output .= $itoa64[$value & 0x3f];
if ($i < $count)
{
$value |= ord($input[$i]) << 8;
}
$output .= $itoa64[($value >> 6) & 0x3f];
if ($i++ >= $count)
{
break;
}
if ($i < $count)
{
$value |= ord($input[$i]) << 16;
}
$output .= $itoa64[($value >> 12) & 0x3f];
if ($i++ >= $count)
{
break;
}
$output .= $itoa64[($value >> 18) & 0x3f];
}
while ($i < $count);
return $output;
}
function _hash_crypt_private($password, $setting, &$itoa64)
{
$output = '*';
// Check for correct hash
if (substr($setting, 0, 3) != '$H$')
{
return $output;
}
$count_log2 = strpos($itoa64, $setting[3]);
if ($count_log2 < 7 || $count_log2 > 30)
{
return $output;
}
$count = 1 << $count_log2;
$salt = substr($setting, 4, 8);
if (strlen($salt)
!= 8)
{
return $output;
}
if (PHP_VERSION >= 5)
{
$hash = md5($salt . $password, true);
do
{
$hash = md5($hash . $password, true);
}
while (--$count);
}
else
{
$hash = pack('H*', md5($salt . $password));
do
{
$hash = pack('H*', md5($hash . $password));
}
while (--$count);
}
$output = substr($setting, 0, 12);
$output .= $_hash_encode64($hash, 16, $itoa64);
return $output;
}
public function phpbb_hash($password)
{
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$random_state = $unique_id();
$random = '';
$count = 6;
if (($fh = @fopen('/dev/urandom', 'rb')))
{
$random = fread($fh, $count);
fclose($fh);
}
if (strlen($random) < $count)
{
$random = '';
for ($i = 0; $i < $count; $i += 16)
{
$random_state = md5($unique_id() . $random_state);
$random .= pack('H*', md5($random_state));
}
$random = substr($random, 0, $count);
}
$hash = $_hash_crypt_private($password, $_hash_gensalt_private($random, $itoa64), $itoa64);
if (strlen($hash) == 34)
{
return $hash;
}
return md5($password);
}
function phpbb_check_hash($password, $hash)
{
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
if (strlen($hash) == 34)
{
return ($_hash_crypt_private($password, $hash, $itoa64) === $hash) ? true : false;
}
return (md5($password) === $hash) ? true : false;
}
Код: Выделить всё
$browser = get_browser(null, true);
$ss = array(
'sid' => md5(date('U').rand(0,20)),
'user_id' => $forum['user_id'],
'forum_id' => '0',
'last_visit' => date('U'),
'start_time' => date('U'),
'session_time' => date('U')+86400,
'session_page' => 'index.php',
'remote_ip' => getenv('REMOTE_ADDR'),
'browser' => htmlspecialchars($browser['browser_name_pattern']),
'autologin' => '1'
);