вход/регистрация отдельно

Автор zedzhen, 03 июня 2020, 13:13:12

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

zedzhen

А как сделать чтобы данные о пользователях брались из другой БД.
И вход/регистрация были через другой сайт?

у меня будет отдельный сайт на котором пользователи будут входить/регистрироваться.
и надо чтобы при этом на форуме он тоже логинился.(сайт будет возвращать e-mail(или другие данные о пользователе для однозначной идентификации) и ещё какой-нибудь код проверки).
И при регистрации на сайте(возможно при 1 входе на форум будет отправляться информация о том что нужно зарегистрироваться) на форуме должна появляться его учётная запись.

P.S. Если этот вопрос не в той теме перенесите его в нужную или напишите тут куда его перенести.
Ярыкин Евгений

digger®

$ssi_guest_access = true;
require_once(dirname(__FILE__) . '/SSI.php');

/**
 * Регистрирует нового пользователя SMF
 * @param string $userName логин
 * @param string $userEmail email
 * @param string $userPassword пароль
 * @return bool|string|int возвращает
 * false при ошибке регистрации
 * no_email, если email не задан
 * bad_email, если email не валидный
 * email_taken, если email уже занят
 * no_username, если логин не задан
 * username_taken, если логин уже занят
 * bad_password, если пароль не соответствует настройкам SMF
 * id нового пользователя, если он успешно зарегистрирован
 */
function registerSmfUser($userName = '', $userEmail = '', $userPassword = '')
{
    global $sourcedir, $smcFunc;
    if (empty($userName)) {
        return 'no_username';
    }

    require_once($sourcedir . '/Subs-Members.php');
    require_once($sourcedir . '/Subs-Auth.php');
    require_once($sourcedir . '/Profile-Modify.php');

    // Обрезать логин до 24 символов
    $userName = mb_substr($userName, 0, 24, 'UTF-8');

    // Проверить, что email валидный и не занят
    if (profileValidateEmail($userEmail) !== true) {
        return profileValidateEmail($userEmail);
    }

    // Проверить, что username не занят
    $request = $smcFunc['db_query']('', '
 SELECT id_member
 FROM {db_prefix}members
 WHERE member_name = {string:username}
 LIMIT 1',
        array(
            'username' => $userName,
        )
    );

    if ($smcFunc['db_num_rows']($request) != 0) {
        $smcFunc['db_free_result']($request);
        return 'username_taken';
    }

    // Проверить, что пароль валидный
    if (validatePassword($userPassword, $userName) !== null) {
        return 'bad_password';
    }

    $regOptions = array(
        'username' => $userName,
        'email' => $userEmail,
        'password' => $userPassword,
        'password_check' => $userPassword,
        'check_reserved_name' => false,
        'check_password_strength' => false,
        'check_email_ban' => false,
        'send_welcome_email' => false,
      'memberGroup' => 0,
        'require' => 'nothing',
    );

    $regOptions['extra_register_vars'] = array(
        'real_name' => $userName,
        'is_activated' => 1,
        'hide_email' => 1,
    );

    $memberID = registerMember($regOptions);
    unset($regOptions);

    if (is_int($memberID)) {
        return $memberID;
    } else {
        return false;
    }
}

/**
 * Залогинивает пользователя SMF
 * @param int $userID ID пользователя SMF которого нужно залогинить
 * @return bool возвращает true или false, если пользователя не существует или он не активен
 */
function loginSmfUser($userID = 0)
{
    global $sourcedir, $smcFunc, $modSettings, $scripturl;

    if (empty($userID)) {
        return false;
    }

    // Данные этого пользователя
    $request = $smcFunc['db_query']('', '
SELECT id_member, passwd, password_salt, is_activated, member_ip
FROM {db_prefix}members
WHERE id_member = {int:user_id}
LIMIT 1',
        array(
            'user_id' => (int)$userID,
        )
    );

    // Нет такого пользователя
    if ($smcFunc['db_num_rows']($request) == 0) {
        return false;
    }

    $userInfo = $smcFunc['db_fetch_assoc']($request);

    // Пользователь активирован?
    if ($userInfo['is_activated'] != 1) {
        return false;
    }

    // Создаем сессию
    require_once($sourcedir . '/Subs-Auth.php');
    $_SESSION['login_url'] = $scripturl;
    $_SESSION['log_time'] = 0;
    setLoginCookie(60 * $modSettings['cookieTime'], $userInfo['id_member'],
        sha1($userInfo['passwd'] . $userInfo['password_salt']));
    updateMemberData($userInfo['id_member'], array(
        'last_login' => time(),
    ));

    return true;
}


zedzhen

А это код для сайта с регистрацией?
Если да, то мне нужен был код для форума.
пользователь нажимает кнопку вход/регистрация и происходит переадресация на сайт login.exemple.org.
там он входит и он переадресовывается он обратно на сайт site.exemple.org?email=choto@choto.choto&hash=*
вместо * случайная строка. И далее идёт обращение к БД(не к основной) и если верно, то авторизовано.
Ярыкин Евгений

digger®

#3
Это типовой код для стороннего вызова регистрации/авторизации, где его использовать - неважно. loginSmfUser легко поменять на логин по email вместо userID.

zedzhen

#4
А куда вставлять данный код?
Ярыкин Евгений

digger®

Цитата: zedzhen от 03 июня 2020, 18:44:41А куда вставлять данный код?
Вы же понимаете, что это не "серебряная пуля", а просто заготовка, для тех кто понимает что с этим делать?
Я бы на сайт вставил, где авторизация и регистрация происходит, для чего этот код и был сделан.
Если у вас какой-то свой путь через форум, можно попробовать просто в index.php воткнуть, выловить из $_GET, что вы там с сайта отправите и выполнить нужное действие.