Вот мой код для входа ниже, он довольно стандартный. Зачем пользователю, который нажимает логин на steamcommunity. Ниже этот код представляет собой быстрый отладочный вывод, который я создал вместе, который демонстрирует, что, хотя отправляются 2 AuthURL, по какой-то причине LightOpenID применяет первый возвращенный результат к каждому пользователю, пытающемуся аутентифицироваться через steam в аналогичное время. То есть добираться до steamcommunity и входить в систему.
<?
ob_start();
session_start();
if(isset($_GET['logout']))
{
if(isset($_COOKIE[session_name()])):
setcookie(session_name(), '', time()-7000000, '/');
endif;
if(isset($_COOKIE['login_user'])):
setcookie('login_user', '', time()-7000000, '/');
endif;
session_unset();
session_destroy();
header("Location: index.php");
}
include "kern/apikey.php";
include "kern/openid.php";
$OpenID = new LightOpenID("xxxxxx.com");
if(!$OpenID->mode)
{
if(isset($_GET['login']))
{
$OpenID->identity = "http://steamcommunity.com/openid";
header("Location: " . $OpenID->authUrl());
}
if(!isset($_SESSION['SteamAuth']))
{
$login = "<div id=\"login\">In order to access the panel, you must <br /><br /> <a href=\"?login\"><img src=\"http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_large_noborder.png\"/></a></div>";
}
} else if ($OpenID->mode == "cancel")
{
echo "Authentication Cancelled...";
} else {
if($OpenID->validate())
{$id = $OpenID->identity;
$_SESSION['SteamID64'] = str_replace("http://steamcommunity.com/openid/id/", "", $id);
$_SESSION['SteamAuth'] = true;
$Steam64 = str_replace("http://steamcommunity.com/openid/id/", "", $id);
$profile = file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$Steam64}");
$steam = json_decode($profile, true);
$communityid = $steam['response']['players'][0]['steamid'];
$authserver = bcsub($communityid, '76561197960265728') & 1;
$authid = (bcsub($communityid, '76561197960265728')-$authserver)/2;
$_SESSION['SteamID'] = "STEAM_0:" . $authserver . ":" . $authid;
$_SESSION['SteamName'] = $steam['response']['players'][0]['personaname'];
header("Location: index.php");
} else {
echo "User is not logged in";
}
}
?>
<html>
<body>
<div id="title">Login</div>
<div id="content">
<?
echo $login;
?>
</div>
</body>
</html>
Посмотрите файл журнала ниже, который указывает, что AuthURL отправляется дважды, но фактически используется только один ответ:
[09-Nov-2014 14:09:52 America/Chicago] Begin login!
[09-Nov-2014 14:09:52 America/Chicago] Sent authurl!xxxxx
[09-Nov-2014 14:10:03 America/Chicago] Begin login!
[09-Nov-2014 14:10:03 America/Chicago] Sent authurl!xxxxx
[09-Nov-2014 14:10:10 America/Chicago] Begin login!
[09-Nov-2014 14:10:11 America/Chicago] Got identity!http://steamcommunity.com/openid/id/xxxx
[09-Nov-2014 14:10:11 America/Chicago] Using Steam64!xxxx
[09-Nov-2014 14:10:11 America/Chicago] Using string steam64!xxxx
Как вы можете видеть, хотя 2 AuthURL отправляются в одно и то же время, как только возвращается один идентификатор, он применяет его к обоим пользователям, а это означает, что люди вошли в неправильные учетные записи.
Эта проблема кажется полностью воспроизводимой с помощью https://github.com/SmItH197/SteamAuthentication Примеры PHP
Действия по воспроизведению:
1. Первый пользователь нажимает «Войти через Steam», зависает при входе OpenID в steamcommunity.com.
2. Второй пользователь нажимает кнопку «Войти через steam», руки на steamcommunity.com.
3. Оба пользователя затем нажимают, один будет зарегистрирован как другой.
Протестировано это на внешнем веб-сервере. Оказывается, это происходит из-за конфигурации сервера / PHP, не совсем уверенной, почему это происходит или в чем причина, поэтому мое решение будет сейчас перенести мой steamauth на другой сервер.
Других решений пока нет …