Как работает проверка идентификатора OpenID?

Ну, я пытаюсь внедрить вход Steam OpenID на сайт, но я не совсем уверен, как это делается и как Steam проверяет пользователей, которые вошли в систему с 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://img.ruphp.com/php/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(); } 

Я принимаю этот код в качестве примера

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

 if(!openid->mode) 

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

И следующий – это еще, если пользователь не запустил сообщение отмены отмены

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

Но я мало что понимаю.

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

И это

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

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

Solutions Collecting From Web of "Как работает проверка идентификатора OpenID?"

Это код, который я использовал для аутентификации через 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://img.ruphp.com/php/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(); } ?> в <?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://img.ruphp.com/php/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(); } ?> 

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

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