Steam-авторизация

Temlik

Участник
Сообщения
668
Реакции
174
Подскажите, пожалуйста, как сделать на сайте авторизацию через Steam? Искал - везде какой-то бред
 
Решение
PHP:
<?php
    session_start();

    try {
        // https://github.com/iignatov/LightOpenID
        require 'openid.php';

        $openid = new LightOpenID($_SERVER['SERVER_NAME']);

        if (!$openid->mode) {
            $openid->identity = 'https://steamcommunity.com/openid';
            header('Location: ' . $openid->authUrl());
        } else if ($openid->validate()) {
            $steamid = $openid->identity;
            $ptn = '/\d{17}/';
            preg_match($ptn, $steamid, $matches);
            $_SESSION['steamid'] = $matches[0];
            header('Location: https://' . $_SERVER['SERVER_NAME']);
        }
    } catch (Exception $error) {
        echo $error;
    }
?>

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #2
Вам именно с технической точки зрения описать процесс или как?
 

Larsalex

Сообщения
812
Реакции
404
1632592731879.png
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@Temlik,
GitHub - iignatov/LightOpenID: Lightweight PHP5 library for easy OpenID authentication.
PHP:
<?php
    include_once($_SERVER['DOCUMENT_ROOT']."/lib/openid.php"); // location openId steam library

    $_STEAMAPI = "__________"; // steam api key

    try
    {
        $openid = new LightOpenID('https://example.ru/steam_auth.php'); // путь до файла авторизации

        if(!$openid->mode)
        {
            $openid->identity = 'http://steamcommunity.com/openid/?l=russian';
            redirect($openid->authUrl());
        }
    
        if($openid->validate())
        {
                $id = $openid->identity;
                $ptn = "/^https:\/\/steamcommunity\.com\/openid\/id\/(7[0-9]{15,25}+)$/";
                preg_match($ptn, $id, $matches);
            
                $url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".$_STEAMAPI."&steamids=".$matches[1]."";
                $json_object= file_get_contents($url);
                $json_decoded = json_decode($json_object);
 
                foreach ($json_decoded->response->players as $player)
                {
                    /*
                        # $player->steamid  - steamid user
                        # $player->personaname - name profile steam
                        # $player->avatarfull - url userpick profile steam
                    */
                }
 
        }
        else
        {
                echo "User is not logged in.\n";
        }
    }
    catch(ErrorException $e)
    {
        echo $e->getMessage();
    }

?>

либу подкрепил в архив, можешь с гита скачать LightOpenID/openid.php at master · iignatov/LightOpenID
 

Вложения

  • openid.rar
    10.2 КБ · Просмотры: 15

Temlik

Участник
Сообщения
668
Реакции
174
Там очень много строчек кода, не думаю, чтобы получить Steam ID, ник, аватарку и т.д. нужно несколько сотен
Сообщения автоматически склеены:

@Temlik,
GitHub - iignatov/LightOpenID: Lightweight PHP5 library for easy OpenID authentication.
PHP:
<?php
    include_once($_SERVER['DOCUMENT_ROOT']."/lib/openid.php"); // location openId steam library

    $_STEAMAPI = "__________"; // steam api key

    try
    {
        $openid = new LightOpenID('https://example.ru/steam_auth.php'); // путь до файла авторизации

        if(!$openid->mode)
        {
            $openid->identity = 'http://steamcommunity.com/openid/?l=russian';
            redirect($openid->authUrl());
        }
   
        if($openid->validate())
        {
                $id = $openid->identity;
                $ptn = "/^https:\/\/steamcommunity\.com\/openid\/id\/(7[0-9]{15,25}+)$/";
                preg_match($ptn, $id, $matches);
           
                $url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=".$_STEAMAPI."&steamids=".$matches[1]."";
                $json_object= file_get_contents($url);
                $json_decoded = json_decode($json_object);
 
                foreach ($json_decoded->response->players as $player)
                {
                    /*
                        # $player->steamid  - steamid user
                        # $player->personaname - name profile steam
                        # $player->avatarfull - url userpick profile steam
                    */
                }
 
        }
        else
        {
                echo "User is not logged in.\n";
        }
    }
    catch(ErrorException $e)
    {
        echo $e->getMessage();
    }

?>

либу подкрепил в архив, можешь с гита скачать LightOpenID/openid.php at master · iignatov/LightOpenID
Ну вот уже что-то похожее на правду, спасибо
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
Там очень много строчек кода, не думаю, чтобы получить Steam ID, ник, аватарку и т.д. нужно несколько сотен

То что тебе скинули это лишь реализация которая работает с Lightopenid v1.3.1 а то что я тебе скинул, напрямую через эту либу работает. На счет качества кода не уверен, может кто-то поправит.
 

Temlik

Участник
Сообщения
668
Реакции
174
Чё то вообще ничего не работает, ладно, потом разберусь. Подскажите ещё, пожалуйста, как узнать ссылку на профиль и аватар по Steam ID (STEAM_1:1:123456789)
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@Temlik, использовать API-Steam, так-же нужно своими средствами конвертировать SteamID в SteamID64

PHP:
$url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=STEAM_API_KEY&steamids=STEAMID64";
$json_object = file_get_contents($url);
$json_decoded = json_decode($json_object);

foreach ($json_decoded->response->players as $player)
{
    /*
        # $player->steamid  - steamid user
        # $player->personaname - name profile steam
        # $player->avatarfull - url userpick profile steam
    */
}

Чё то вообще ничего не работает
Смотря что ты пытаешься сделать и как.
 

Temlik

Участник
Сообщения
668
Реакции
174
@Temlik, использовать API-Steam, так-же нужно своими средствами конвертировать SteamID в SteamID64

PHP:
$url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=STEAM_API_KEY&steamids=STEAMID64";
$json_object = file_get_contents($url);
$json_decoded = json_decode($json_object);

foreach ($json_decoded->response->players as $player)
{
    /*
        # $player->steamid  - steamid user
        # $player->personaname - name profile steam
        # $player->avatarfull - url userpick profile steam
    */
}


Смотря что ты пытаешься сделать и как.
И как конвертировать Steam ID в Steam ID 64?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #11
И как конвертировать Steam ID в Steam ID 64?
Это банальная математика.
Принято представлять v2 в виде строки STEAM_X:Y:Z
  • X ни на что не влияет, оно от игры зависит
  • Y - сервер аутентификации (как все предполагают), и их всего два (0 и 1 соответственно)
  • Z - идентификатор аккаунта на сервере
Формула выглядит так: 76561197960265728 + ((Z * 2) + Y)
76561197960265728 - константа. Ниже этого числа нет никаких аккаунтов, как и на нём самом.
Следовательно, самый первый аккаунт в Стиме - STEAM_0:1:0 или 76561197960265729 (ссылка).

Думаю, дальше сами разберётесь. Можете попробовать сами на Виндовом калькуляторе поиграться, поскладывать числа.
Минимальная реализация для тех, кому за 60 лет влом думать (на PHP):
PHP:
<?php

// Требуется расширение GMP.
$steamId = 'STEAM_0:0:55665612';
$baseCommunityId = '76561197960265728';

$parts = explode(':', $steamId);
$steamY = intval($parts[1]);
$steamZ = intval($parts[2]);

$communityId = gmp_strval(gmp_add($baseCommunityId, ($steamZ * 2) + $steamY));
echo($communityId); // Должно вывести 76561198071596952
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@Temlik, я тебе уже два примера скинул на реализацию, CTRL C / CTRL V что не работает то?

на счет конвертации есть целая статья (что такое steamid) SteamID - Valve Developer Community ну или то что @Kruzya тебе дал на русском с примером
 

Temlik

Участник
Сообщения
668
Реакции
174
Добавить просто Community ID к ссылке https://steamcommunity.com/profiles/ уже не подходит?
А, точняк
Сообщения автоматически склеены:

@Temlik, я тебе уже два примера скинул на реализацию, CTRL C / CTRL V что не работает то?
В 1 слишком много кода (я его представлял как @Kruzya написал), а во 2 я не знаю что дальше делать, поэтому и написал
Сообщения автоматически склеены:

Как мне теперь через JSON получить аватарку? $json_decoded->response->players......
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,927
  • Команда форума
  • #16
@Temlik, в метод json_encode вторым параметром передайте true, и далее проще станет намного: $json_decoded['response']['players'][0]['avatarfull']
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
1 слишком много кода
В смысле слишком много кода, то что заявлено в теме "Steam авторизация" то я тебе и помог сделать, это авторизация стима - а то что ты костыли какие-то придумываешь, это конечно твое дело уже.

Во втором примере это вообще тот конечно еще костыль, но тебе же надо без дополнительных биб.
То что тебе @Kruzya дал это никак не относится к понятию "стим-авторизации", это лишь пример реализации конвертации стим-айди по формуле.

PHP:
$url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=STEAM_API_KEY&steamids=799966666621212";
$json_object = file_get_contents($url);
$json_decoded = json_decode($json_object);

foreach ($json_decoded->response->players as $player)
{
    echo $player->steamid; // отобразим на сайте STEAMID64
    echo $player->personaname; // отобразим на сайте Ник
    echo $player->profileurl; // отобразим на сайте ссылку на профиль
    echo $player->avatarfull; // отобразим на сайте ссылку на аватар
    echo $player->personastate; // отобразим на сайте статус в стиме
}
Результат выполнения:
1632683136910.png

более подробнее сюда Steam Web API - Valve Developer Community

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

Temlik

Участник
Сообщения
668
Реакции
174
В смысле слишком много кода, то что заявлено в теме "Steam авторизация" то я тебе и помог сделать, это авторизация стима - а то что ты костыли какие-то придумываешь, это конечно твое дело уже.

Во втором примере это вообще тот конечно еще костыль, но тебе же надо без дополнительных биб.
То что тебе @Kruzya дал это никак не относится к понятию "стим-авторизации", это лишь пример реализации конвертации стим-айди по формуле.

PHP:
$url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=STEAM_API_KEY&steamids=799966666621212";
$json_object = file_get_contents($url);
$json_decoded = json_decode($json_object);

foreach ($json_decoded->response->players as $player)
{
    echo $player->steamid; // отобразим на сайте STEAMID64
    echo $player->personaname; // отобразим на сайте Ник
    echo $player->profileurl; // отобразим на сайте ссылку на профиль
    echo $player->avatarfull; // отобразим на сайте ссылку на аватар
    echo $player->personastate; // отобразим на сайте статус в стиме
}
Результат выполнения:
Посмотреть вложение 84896
более подробнее сюда Steam Web API - Valve Developer Community

Ты бы написал сразу чего хочешь добиться, а не ходил во круг да около.
Я же написал, что потом разберусь. И попросил сказать как узнать ссылку на профиль и аватар по Steam ID
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@Temlik, упрощенный вариант, то о чем тебе @Kruzya написал
PHP:
<?php
    $json_object = file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=69C2A61F607FA67C79D51F80AAFD7726&steamids=76561199063318121");
    $json_decoded = json_decode($json_object, true);
    echo "Result: ".$json_decoded['response']['players'][0]['steamid'];
?>

Я же написал, что потом разберусь
а во 2 я не знаю что дальше делать, поэтому и написал
🥴
 

Temlik

Участник
Сообщения
668
Реакции
174
@Temlik, упрощенный вариант, то о чем тебе @Kruzya написал
PHP:
<?php
    $json_object = file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=69C2A61F607FA67C79D51F80AAFD7726&steamids=76561199063318121");
    $json_decoded = json_decode($json_object, true);
    echo "Result: ".$json_decoded['response']['players'][0]['steamid'];
?>



🥴
Что-то у меня 5 сек. страница грузится. Может из-за того, что на локалке? На хосте норм всё будет?
 
Сверху Снизу