Вот мой код входа ниже, он довольно стандартный. Почему пользователь, который нажимает «Войти» в 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. Первый пользователь нажимает "Войти через стим", зависает при входе на steamcommunity.com OpenID. 2. Второй пользователь нажимает "Войти через steam", руками авторизируется на steamcommunity.com. 3. Затем оба пользователя переходят по ссылке, один из них войдет в систему как другой.