24

始める前に、私は OpenID についてまったく何も知らないと言っておきましょう。私は OpenID が何のために使われているかさえ知りたくありませんが、人々がそれについて言及するだろうとは思いますが、それは私が探しているものではありません。

私はソフトウェアを持っています。そのソフトウェアでは、ユーザーは登録時に Steam ユーザー名を提供する必要があります。彼らは Steam を介してサインオンするのではなく、他のユーザーが自分の Steam ユーザー名を知ることができるようにユーザー名を提供するだけです。したがって、OpenID は必要ありません。

テキスト フィールドを追加するだけで、Steam ユーザー名を一覧表示して、1 日で終わることができます。ただし、これを行うと、ユーザーはほとんどすべての Steam ユーザー名を入力して完了できます。代わりに、ユーザー名を確認できるようにしたいと思います。

「Steam アカウントの認証」ボタンがあれば理想的です。人々がそれをクリックすると、Steam ログインフォームが表示されます。ユーザーがログインすると、Steam がユーザー名 (およびアバターなどの追加データ) を返します。これを行う最良の方法は何ですか?

4

1 に答える 1

41

OpenID が必要です。これは、Valve がドキュメントに従って使用する方法です。

あなたのアプリケーションが書かれているものについては言及していないので、Webページを介してこれを行っているとしか推測できません. その場合は、LightOpenIDライブラリを使用することをお勧めします。そこから、このサンプル コードを使用して作業を開始できます。

<?php
require 'includes/lightopenid/openid.php';
$_STEAMAPI = "YOURSTEAMAPIKEY";
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";

                $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 ログイン ID ボタンを表示します。クリックすると、ユーザーは Steam コミュニティのログイン ページにリダイレクトされます。ログイン後、ユーザーはLightOpenIDコンストラクターで設定したページにリダイレクトされます。ユーザーが検証されると、返された値から一意のプレーヤー ID が取得されます。その戻り値は のようhttp://steamcommunity.com/openid/id/76561197960435530になり、その部分だけが必要です76561197960435530

この時点で、Steam にクエリを実行してプレイヤー情報を取得できます。提供されているサンプルでは、​​ユーザーにクエリを実行し、基本的なプレイヤー情報を表示しています。

于 2013-09-08T04:39:55.787 に答える