Как авторизоваться через post запрос на стим сайте (php)?

Для тех, кто хочет сделать мир лучше.
Ответить

0
Голосов нет
 
Всего голосов: 0

Сообщение
Автор
[email protected]
Нович0к
Нович0к
Сообщения: 2
Зарегистрирован: 01.04.2014

#1 Сообщение 01.04.2014, 11:55

Пытаюсь на php авторизоваться на сайте стим. Запрос на steamcommunity.com/login/getrsakey проходит успешно. Запрос на steamcommunity.com/login/dologin/ всегда возвращает incorrect login.
Возможно пароль шифруется неправильно или нужно добавлять ssl.
Библиотек для RSA шифрования использую отсюда http://phpseclib.sourceforge.net/

Код: Выделить всё

function geturl($url, $ref, $cookie, $postdata, $header, &$info, &$output)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36');
        if ($ref)
        {
            curl_setopt($ch, CURLOPT_REFERER, $ref);
        }
        if ($cookie)
        {
            curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        }

        if ($postdata)
        {
            curl_setopt($ch, CURLOPT_POST, true);
            $postStr = "";
            foreach ($postdata as $key => $value)
            {
                if ($postStr)
                    $postStr .= "&";
                $postStr .= $key . "=" . $value;
            }
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postStr);
        }

        curl_setopt($ch, CURLOPT_HEADER, $header);
        $info = curl_getinfo($ch);
        $output = curl_exec($ch);
        curl_close($ch);
    }
geturl("https://steamcommunity.com/login/getrsakey", null, null, array('username' => $login), 0, $info, $output);
$data = json_decode($output, true);

if ($data['success'] === true)
{
    $publickey_exp = $data['publickey_exp'];
    $publickey_mod = $data['publickey_mod'];
    $RSA = new Crypt_RSA();
    $RSA->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $n = new Math_BigInteger($publickey_mod, 16);
    $e = new Math_BigInteger($publickey_exp, 16);

    $key = array("modulus"=>$n, "publicExponent"=>$e);
    $RSA->loadKey($key, CRYPT_RSA_PUBLIC_FORMAT_RAW);
    $encryptedPassword = base64_encode($RSA->encrypt($password, false));
    $captchaGid = -1;
    $captchaText;
    $emailAuth;
    $emailSteamId;

        $params = array(
            'username' => $login,
            'password' => $encryptedPassword,
            'rsatimestamp' => $data['timestamp'],
            'captcha_gid' => $captchaGid,
            'captcha_text' => $captchaText,
            'emailauth' => $emailAuth,
            'emailsteamid' => $emailSteamId
        );
        geturl("https://steamcommunity.com/login/dologin/", null, null, $params, 0, $info, $output);
        $data = json_decode($output, true);
        var_dump($data);
        if ($data['captcha_needed'])
        {
            $captchaGid = $data['captcha_gid'];
            echo '<img src="https://steamcommunity.com/public/captcha.php?gid=' . $captchaGid . '">';
        }
}

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#2 Сообщение 02.04.2014, 21:40

Уже было тут, вроде как пришли к выводу что там реализация RSA нестандартная. И решили использовать мобильное API (для мобльного стимкмюнити). А вообще, было-бы интересно всё-таки разобраться, в чём дела с ихним RSA. Тут вариант с мобильным API не подойдёт?

Аватара пользователя
Megalan
Разработчик
Разработчик
Сообщения: 335
Зарегистрирован: 02.04.2007
Благодарил (а): 1 раз
Поблагодарили: 29 раз
Контактная информация:

#3 Сообщение 04.04.2014, 00:52

Да не, там вроде бы стандартная в итоге оказалась. По крайней мере стандартный rsacryptoserviceprovider из .net подходит.

Код: Выделить всё

    
$n = new Math_BigInteger($publickey_mod, 16);
$e = new Math_BigInteger($publickey_exp, 16);
Вот этот кусок кода зачем? Насколько я помню нормальным генераторам RSA достаточно скормить те данные что пришли с серверов вальв, без каких либо изменений в них.

[email protected]
Нович0к
Нович0к
Сообщения: 2
Зарегистрирован: 01.04.2014

#4 Сообщение 04.04.2014, 23:45

Добавлено спустя 2 минуты 20 секунд:
MOZGIII писал(а):Уже было тут, вроде как пришли к выводу что там реализация RSA нестандартная. И решили использовать мобильное API (для мобльного стимкмюнити). А вообще, было-бы интересно всё-таки разобраться, в чём дела с ихним RSA. Тут вариант с мобильным API не подойдёт?
Про RSA спасибо, попробую по их реализации RSA написать. А для мобильного API такая же авторизация будет?

Добавлено спустя 1 минуту 32 секунды:
Megalan писал(а):Да не, там вроде бы стандартная в итоге оказалась. По крайней мере стандартный rsacryptoserviceprovider из .net подходит.

Код: Выделить всё

    
$n = new Math_BigInteger($publickey_mod, 16);
$e = new Math_BigInteger($publickey_exp, 16);
Вот этот кусок кода зачем? Насколько я помню нормальным генераторам RSA достаточно скормить те данные что пришли с серверов вальв, без каких либо изменений в них.
Это не изменения, а нужно для кодирования в RSA. Насколько я понимаю модуль и експонента.

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#5 Сообщение 06.04.2014, 05:41

[email protected]
Для мобильного просто логин+пароль, без всяких дополнительных оберток в виде rsa.

Ответить