2013-10-03 5 views
0

Ну, я пытаюсь внедрить Steam OpenID на сайт, но я не совсем уверен, как это делается и как Steam проверяет пользователей, которые вошли в систему с OpenID.Как работает проверка пользователя OpenID?

На данный момент я обнаружил, что пар только возвращает идентификатор пользователя и ничего больше, поэтому для остальных вещей мне придется использовать API для получения другой информации о пользователе.

Но я не совсем уверен, как пользователи получают подтверждение на веб-сайте после входа в систему через OpenID.

Нужно ли делать сеанс или устанавливать cookie или хранить пользователя в базе данных после того, как пользователь зарегистрирован в OpenID?

try { 
# Change 'localhost' to your domain name. 
$openid = new LightOpenID('http://localhost/openid'); 
if(!$openid->mode) { 
    if(isset($_GET['login'])) { 
     $openid->identity = 'http://steamcommunity.com/openid'; 
     header('Location: ' . $openid->authUrl()); 
    } 
echo '<li><a href="?login"><img border="0" src="http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_small.png" /></a></li>'; 
} 

elseif($openid->mode == 'cancel') { 
    echo 'User has canceled authentication!'; 
} 

else { 
    $_SESSION['loged']=1; 

    header('Location: http://localhost/openid'); 

} 

if(isset($_SESSION['loged'])) { 

echo '<li><a href="?logout">Logout</a></li>'; 

} 
if(isset($_GET['logout'])) { 
    unset($_SESSION['loged']); 
} 

echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.'; 

} 

catch(ErrorException $e) { 
echo $e->getMessage(); 
} 

Im принимая этот код в качестве примера

Я предполагаю, что

if(!openid->mode) 

означает, что если не OpenID установлен? чем я должен показывать кнопку входа и перейти к OpenId поставщика для входа, если я нажимаю эту кнопку

И дальше, иначе, если пользователь не войти в шоу Отменить сообщение

или следующая часть, если пользователь loged в так так openid возвращает только идентификатор пользователя. Мне нужно как-то разобраться с ним и оставить его на моем сайте, для этой части я должен установить сеанс или файл cookie, который я установил для сеанса и перенаправил пользователя на домашнюю страницу.

Но я ничего не понимаю.

Почему моя кнопка входа в систему отображается постоянно?

И это

echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.'; 

Почему это не работает? это всегда показывает пользователю не LoggedIn

ответ

5

Это код, который я использовал для проверки подлинности с помощью OpenID в Steam

<?php 
require 'includes/lightopenid/openid.php'; 
$_STEAMAPI = "YOURSTEAMAPIKEY"; 

// CHECK IF COOKIE EXISTS WITH PROFILE ID. IF NOT, LOG THE USER IN 

try 
{ 
    $openid = new LightOpenID('http://URL.TO.REDIRECT.TO.AFTER.LOGIN/'); 
    if(!$openid->mode) 
    { 
     if(isset($_GET['login'])) 
     { 
      $openid->identity = 'http://steamcommunity.com/openid/?l=english'; // This is forcing english because it has a weird habit of selecting a random language otherwise 
      header('Location: ' . $openid->authUrl()); 
     } 
?> 
<form action="?login" method="post"> 
    <input type="image" src="http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_small.png"> 
</form> 
<?php 
    } 
    elseif($openid->mode == 'cancel') 
    { 
     echo 'User has canceled authentication!'; 
    } 
    else 
    { 
     if($openid->validate()) 
     { 
       $id = $openid->identity; 
       // identity is something like: http://steamcommunity.com/openid/id/76561197960435530 
       // we only care about the unique account ID at the end of the URL. 
       $ptn = "/^http:\/\/steamcommunity\.com\/openid\/id\/(7[0-9]{15,25}+)$/"; 
       preg_match($ptn, $id, $matches); 
       echo "User is logged in (steamID: $matches[1])\n"; 
       // HERE YOU CAN SET A COOKIE, SAVE TO A DATABASE, CREATE A SESSION, ETC. 

       // This is an example of what you can do once you have the profile id  
       $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) 
       { 
        echo " 
        <br/>Player ID: $player->steamid 
        <br/>Player Name: $player->personaname 
        <br/>Profile URL: $player->profileurl 
        <br/>SmallAvatar: <img src='$player->avatar'/> 
        <br/>MediumAvatar: <img src='$player->avatarmedium'/> 
        <br/>LargeAvatar: <img src='$player->avatarfull'/> 
        "; 
       } 

     } 
     else 
     { 
       echo "User is not logged in.\n"; 
     } 
    } 
} 
catch(ErrorException $e) 
{ 
    echo $e->getMessage(); 
} 
?> 

Это предоставляет пользователю с помощью кнопки ID Паровой Вход, когда он щелкнул будет перенаправить пользователя на страницу входа в Community Steam. После входа в систему пользователь отправляется обратно в ваш домен. Это то, что установлено в конструкторе LightOpenID. Если пользователь был проверен, он вытащит уникальный идентификатор игрока из возвращаемого значения. Это возвращаемое значение выглядит как http://steamcommunity.com/openid/id/76561194350435530, и вам нужно всего лишь часть 76561194350435530. Используя это, вы можете запросить любой API-интерфейс Valve, который принимает идентификатор профиля.

Настройка файлов cookie и сеансов может быть выполнена в конце процесса входа в систему.

+1

Да, это помогло мне, я все еще не совсем уверен, как это работает, но у меня есть то, что я хотел достичь, теперь у меня есть пользователи, прошедшие проверку, зарегистрированные на веб-сайте и в сеансе, и вот что мне нужно было сделать дальше с веб-сайтом. Благодарю. –

Смежные вопросы