ラベル OpenID の投稿を表示しています。 すべての投稿を表示
ラベル OpenID の投稿を表示しています。 すべての投稿を表示

2018年2月26日月曜日

Steam に OpenID で接続する

Steam Web API の続きです。

自分のアカウントで Sign in する機能を忘れていたので実装してみました。
↓こういうやつ
Steam には OpenID で接続します。
https://steamcommunity.com/dev

接続には、ここで紹介されていた LightOpenID を使います。

以前に作成した対戦履歴を表示するコードを、以下のように変更しました。

  • Steam ID をセッションから取得する
    • 無ければ Sign in させる
  • API Key を環境変数から取得する

session_start();
if (!isset($_SESSION['steam_id'])) {
 // Require sign in.
 echo "
 <div style='text-align:center'>
  <p><a href='/auth.php'><img src='http://steamcommunity-a.akamaihd.net/public/images/signinthroughsteam/sits_02.png' width='109' height='66' border='0'></a></p>
  <p>Please sign in.</p>
 </div>
 ";
} else {

 // https://gist.github.com/almirsarajcic/4664387
 function convert_steamid_64bit_to_32bit($id)
 {
  $result = substr($id, 3) - 61197960265728;
  return (string) $result;
 }
 function convert_steamid_32bit_to_64bit($id)
 {
  $result = '765'.($id + 61197960265728);
  return (string) $result;
 }

 $key = getenv("STEAM_API_KEY"); // Set API key from environment variable.
 $steamid = $_SESSION['steam_id']; // Set target's steam id here.
 echo "<h2>SteamID : {$steamid}</h2>";
 $accountid = convert_steamid_64bit_to_32bit($steamid);
 echo "<h2>accountid : {$accountid}</h2>";

 $curl = curl_init();
 
 // ヒーローリストを取得する
 curl_setopt($curl, CURLOPT_URL, "https://api.steampowered.com/IEconDOTA2_570/GetHeroes/v1?key={$key}");
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $json = curl_exec($curl);
 $response = json_decode($json);
 $heroes = [];
 foreach ($response->result->heroes as $hero) {
  $heroes[$hero->id] = str_replace("npc_dota_hero_", "", $hero->name);
 }

 // 対戦履歴を取得する
 curl_setopt($curl, CURLOPT_URL, "https://api.steampowered.com/IDOTA2Match_570/GetMatchHistory/v1?key={$key}&account_id={$accountid}");
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $json = curl_exec($curl);
 $response = json_decode($json);

 curl_close($curl);

 // 対戦履歴一覧を表示する
 foreach ($response->result->matches as $match) {
  $start_time = new DateTime('@' . $match->start_time);
  foreach ($match->players as $player) {
   if ($player->account_id == $accountid) {
    $hero_name = $heroes[$player->hero_id];
    $img = "<img src='http://cdn.dota2.com/apps/dota2/images/heroes/{$hero_name}_sb.png'>";
   }
  }

  echo "
  <div>
  {$start_time->format('Y/m/d H:i:s')}
  {$img}
  </div>
  ";
 }

}
index.php

Sign in は別のファイルで実装しました。
<?php
include_once("../vendor/autoload.php");

$openid = new LightOpenID("https://test-steam-web-api.azurewebsites.net");
$openid->identity = "http://steamcommunity.com/openid";
$openid->returnUrl = "https://test-steam-web-api.azurewebsites.net/auth.php";

if (!$openid->mode) {
 header('Location: ' . $openid->authUrl());
} elseif ($openid->mode == 'cancel') {
 header('Location: /');
} else {
 if ($openid->validate()) {
  session_start();

  $claimed = explode("http://steamcommunity.com/openid/id/", $openid->identity);
  $steam_id = $claimed[1];
  $_SESSION['steam_id'] = $steam_id;
 }

 header('Location: /');
}

exit;
auth.php

実際に動かせるサイトを準備しました。
コードはこちら

参考

https://steamcommunity.com/dev
https://github.com/iignatov/LightOpenID/blob/master/examples/example.php