Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Туториал Интеграция FMXLauncher с разными CMS

Там сейчас вообще другая структура, и данного файла нет.
Не слишком силен в php, но думаю эта часть отвечает за хэширование.
PHP:
    /**
     * Encrypt a plaintext password
     *
     * @param    string    $password    Password to encrypt
     * @return    string    Encrypted password
     * @todo    [Future] When we increase minimum PHP version, adjust blowfish to $2y$
     */
    public function encryptedPassword( $password )
    {
        /* New password style introduced in IPS4 using Blowfish */
        if ( mb_strlen( $this->members_pass_salt ) === 22 )
        {
            return crypt( $password, '$2a$13$' . $this->members_pass_salt );
        }
        /* Old encryption style using md5 */
        else
        {
            return md5( md5( $this->members_pass_salt ) . md5( \IPS\Request::legacyEscape( $password ) ) );
        }
    }
 
Там сейчас вообще другая структура, и данного файла нет.
Не слишком силен в php, но думаю эта часть отвечает за хэширование.
PHP:
    /**
     * Encrypt a plaintext password
     *
     * @param    string    $password    Password to encrypt
     * @return    string    Encrypted password
     * @todo    [Future] When we increase minimum PHP version, adjust blowfish to $2y$
     */
    public function encryptedPassword( $password )
    {
        /* New password style introduced in IPS4 using Blowfish */
        if ( mb_strlen( $this->members_pass_salt ) === 22 )
        {
            return crypt( $password, '$2a$13$' . $this->members_pass_salt );
        }
        /* Old encryption style using md5 */
        else
        {
            return md5( md5( $this->members_pass_salt ) . md5( \IPS\Request::legacyEscape( $password ) ) );
        }
    }
Перепишу щас скрипт.
@boatswain, проверяй.
 
День добрый!, можете помочь с запросом для Authme?
Лаунчер выдает ошибку "error at SQL query"
В коде подправил "login" на 'username' - лаунчер начал писать "User not found"
PHP:
<?php
    include_once('settings.php');
    define('USER_EXISTS'    , 0);
    define('USER_NOT_EXISTS', 1);
    define('SQL_ERROR'      , 2);
    function IsPlayerInBase($db_handle, $login, $password) {
        global $players_table_name;
        $sth = $db_handle->prepare("SELECT `password` FROM `{$players_table_name}` WHERE `username`=:login");
        if ($sth->execute(array('username' => $login))) {
            $gethash=$sth->fetch(PDO::FETCH_ASSOC);
            $hash = $gethash['password'];
            $exp = preg_split('/\\$/', $hash);
            $salt = $exp[2];
            $rpass = '$SHA$'.$salt.'$'.hash('sha256',hash('sha256',$password).$salt);
        } else {
            return USER_NOT_EXISTS;
        }
        $user = array(
            'username'    => $login,
            'password' => $rpass
        );
        $sql = $db_handle->prepare("SELECT COUNT(1) FROM `{$players_table_name}` WHERE `username`=:login AND BINARY `password`=:password");
        if ($sql->execute($user)) {
            if ($sql->fetchColumn()) {
                return USER_EXISTS;
            } else {
                return USER_NOT_EXISTS;
            }
        } else {
            return SQL_ERROR;
        }
    }
?>

Колонки в таблице: id - username - password - ip - lastlogin
 
День добрый!, можете помочь с запросом для Authme?
Лаунчер выдает ошибку "error at SQL query"
В коде подправил "login" на 'username' - лаунчер начал писать "User not found"
PHP:
<?php
    include_once('settings.php');
    define('USER_EXISTS'    , 0);
    define('USER_NOT_EXISTS', 1);
    define('SQL_ERROR'      , 2);
    function IsPlayerInBase($db_handle, $login, $password) {
        global $players_table_name;
        $sth = $db_handle->prepare("SELECT `password` FROM `{$players_table_name}` WHERE `username`=:login");
        if ($sth->execute(array('username' => $login))) {
            $gethash=$sth->fetch(PDO::FETCH_ASSOC);
            $hash = $gethash['password'];
            $exp = preg_split('/\\$/', $hash);
            $salt = $exp[2];
            $rpass = '$SHA$'.$salt.'$'.hash('sha256',hash('sha256',$password).$salt);
        } else {
            return USER_NOT_EXISTS;
        }
        $user = array(
            'username'    => $login,
            'password' => $rpass
        );
        $sql = $db_handle->prepare("SELECT COUNT(1) FROM `{$players_table_name}` WHERE `username`=:login AND BINARY `password`=:password");
        if ($sql->execute($user)) {
            if ($sql->fetchColumn()) {
                return USER_EXISTS;
            } else {
                return USER_NOT_EXISTS;
            }
        } else {
            return SQL_ERROR;
        }
    }
?>

Колонки в таблице: id - username - password - ip - lastlogin
Потому что не надо было ничего трогать)
А по сути, я забыл кое-что заменить.
Вот рабочий пример:
PHP:
<?php
    include_once('settings.php');

    define('USER_EXISTS'    , 0);
    define('USER_NOT_EXISTS', 1);
    define('SQL_ERROR'      , 2);

    function IsPlayerInBase($db_handle, $login, $password) {

        global $players_table_name;

        $sth = $db_handle->prepare("SELECT `password` FROM `{$players_table_name}` WHERE `username`=:login");

        if ($sth->execute(array('login' => $login))) {
            $gethash=$sth->fetch(PDO::FETCH_ASSOC);
            $hash = $gethash['password'];

            $exp = preg_split('/\\$/', $hash);
            $salt = $exp[2];

            $rpass = '$SHA$'.$salt.'$'.hash('sha256',hash('sha256',$password).$salt);
        } else {
            return USER_NOT_EXISTS;
        }

        $user = array(
            'login'    => $login,
            'password' => $rpass
        );

        $sql = $db_handle->prepare("SELECT COUNT(1) FROM `{$players_table_name}` WHERE `username`=:login AND BINARY `password`=:password");

        if ($sql->execute($user)) {
            if ($sql->fetchColumn()) {
                return USER_EXISTS;
            } else {
                return USER_NOT_EXISTS;
            }

        } else {
            return SQL_ERROR;
        }

    }
?>
 
Потому что не надо было ничего трогать)
А по сути, я забыл кое-что заменить.
Вот рабочий пример:
PHP:
<?php
    include_once('settings.php');

    define('USER_EXISTS'    , 0);
    define('USER_NOT_EXISTS', 1);
    define('SQL_ERROR'      , 2);

    function IsPlayerInBase($db_handle, $login, $password) {

        global $players_table_name;

        $sth = $db_handle->prepare("SELECT `password` FROM `{$players_table_name}` WHERE `username`=:login");

        if ($sth->execute(array('login' => $login))) {
            $gethash=$sth->fetch(PDO::FETCH_ASSOC);
            $hash = $gethash['password'];

            $exp = preg_split('/\\$/', $hash);
            $salt = $exp[2];

            $rpass = '$SHA$'.$salt.'$'.hash('sha256',hash('sha256',$password).$salt);
        } else {
            return USER_NOT_EXISTS;
        }

        $user = array(
            'login'    => $login,
            'password' => $rpass
        );

        $sql = $db_handle->prepare("SELECT COUNT(1) FROM `{$players_table_name}` WHERE `username`=:login AND BINARY `password`=:password");

        if ($sql->execute($user)) {
            if ($sql->fetchColumn()) {
                return USER_EXISTS;
            } else {
                return USER_NOT_EXISTS;
            }

        } else {
            return SQL_ERROR;
        }

    }
?>

Благодарю, работает!
 
Может я в чем-то не прав, но по-моему лучше юзать отдельные классы (можно и не отдельные, кому как нравится), которые будут авторизовываться методами целевых ЦМС, чем переписывать куски кода авторизации.

Объясню почему лучше делать так на примере XenForo:
У xf есть множество классов хеширования пароля и можно даже свой сделать, при большом желании. Все хранится в базе. Может быть хоть у каждого юзера свой метод хеширования.
Если поднять инстанс приложения в отдельном скрипте (в скрипте авторизации для лаунчера, например) вся авторизация в XenForo укладывается в 10 строчек кода, не теряя абсолютно никаких "фич" XenForo относительно хеширования и прочих дел. Пример авторизации средствами поднятия инстанса xf где-то тут уже года 2 как лежал.

На мой взгляд это является правильной интеграцией, а не копирование кода авторизации и прямые запросы к таблицам ЦМС. С другой стороны, если ЦМС не предусматривает вообще ничего, кроме md5, то почему бы и не напрямую запрашивать...
 

Поделиться этой страницей

Назад
Верх