LaravelでOpenIDを使ってSteamに接続してみる

この記事は「mikage-labアドベントカレンダー」の12日目の記事です。

前回の続きです。

OpenIDを使ってSteamに接続してみます。

Steam authentication for Laravel 5 というパッケージを見つけたのでこれを利用しようと思います。

GitHub - invisnik/laravel-steam-auth: Laravel Steam Auth

Usage Example見ながら作ります。 勉強がてら若干アレンジします。

まずはルーティングを決めます。こんな感じですかね。

メソッド URL コントローラ アクション 備考
GET / AppController index メインページ
GET auth/login AuthController redirectTpSteam ログイン (Steamへリダイレクト)
GET auth/handle AuthController handle Steamからのコールバック
DELETE auth/logout AuthController logout ログアウト

routes/web.php

<?php 
Route::get('/', 'AppController@index');
Route::get('auth/login', 'AuthController@redirectToSteam');
Route::get('auth/handle', 'AuthController@handle');
Route::delete('auth/logout', 'AuthController@logout');

Route::{メソッド}({URL}, '{コントローラ}@{アクション}')

で{URL}を{メソッド}でアクセスしたとき{コントローラ}クラス内の{アクション}メソッドが実行されます。

CakePHPでは特別な設定をしなければ、Controller名とアクション名からURLが自動的に生成されます。

例:AppsControllerのviewメソッドがあればURLは apps/view となる

しかし、LaravelにはCakePHPのようなController名によるルーティングは無さそうです。

ルーティングに関しては、CakePHPの「設定より規約」なスタンスと違って、Laravelは言うなれば「規約より設定」なスタンスを取っていることが伺えます。

どちらにしろ、URLはメソッドも含め詳しく決めることになるので、自分の思ったとおりにルーティングできる分、Laravelのルーティングのほうが良さそうですね。

次行きましょ。ルーティングを変更したのでconfig/steam-auth.phpも変更。

リダイレクト先を/auth/steam/handleから/auth/handleに変更します。

config/steam-auth.php

<?php
return [
    /*
     * Redirect URL after login
     */
    'redirect_url' => '/auth/handle',
    /*
     *  API Key (set in .env file) [http://steamcommunity.com/dev/apikey]
     */
    'api_key' => env('STEAM_API_KEY', ''),
    /*
     * Is using https?
     */
    'https' => false
];

AuthControllerはこんな感じで作ります。

Usage Exampleとの違いはDBを使わずにユーザデータだけセッションに登録するところです。

アプリケーション独自のデータを作るわけでもないのでミニマルでいきます。

app/Http/Controllers/AuthController.php

<?php
namespace App\Http\Controllers;

use Invisnik\LaravelSteamAuth\SteamAuth;
use Illuminate\Http\Request;
use App\User;
use Auth;

class AuthController extends Controller
{
    /**
     * SteamAuth
     *
     * @var SteamAuth
     */
    protected $steam;

    /**
     * ログイン/ログアウト後リダイレクト先URL
     *
     * @var string
     */
    protected $redirectURL = '/';

    /**
     * コンストラクタ
     * 
     * @param SteamAuth $steam
     */
    public function __construct(SteamAuth $steam)
    {
        $this->steam = $steam;
    }

    /**
     * Steamのユーザ認証ページへリダイレクトする
     *
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function redirectToSteam()
    {
        return $this->steam->redirect();
    }

    /**
     * ユーザ情報を取得する
     * セッションにユーザー情報を登録
     *
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function handle(Request $request)
    {
        if ($this->steam->validate()) {
            $info = $this->steam->getUserInfo();

            if (!is_null($info)) {
                $request->session()->put('user', $info->attributes());
                return redirect($this->redirectURL)->with('success', 'ログインしました。'); // redirect to site
            }
        }
        return $this->redirectToSteam();
    }

    /**
     * ログアウトする
     * セッションを破棄するだけ
     * 
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function logout(Request $request) {
        $request->session()->flush(); 
        return redirect($this->redirectURL)->with('success', 'ログアウトしました。'); // redirect to site
    }
}

AppControllerを作って、ログインしたユーザーのゲーム一覧を表示するようにしたいので…

app/Http/Controllers/AppController.php

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\Config;
use App\User;
use Illuminate\Http\Request;
use GuzzleHttp\Client as GuzzleClient;
use Auth;

class AppController extends Controller
{
    /**
     * GuzzleClient
     * @var GuzzleClient
     */
    private $guzzleClient;

    /**
     * SteamAPIキー
     *
     * @var string
     */
    private $apiKey;

    public function __construct()
    {
        $this->guzzleClient = new GuzzleClient;
        $this->apiKey = Config::get('steam-auth.api_key');
    }

    /**
     * アプリメイン画面
     * 
     * @param Request $request
     */
    public function index(Request $request)
    {
        // ユーザ情報を取得
        $user = $request->session()->get('user');

        // ユーザ情報がなければ、index Viewを表示
        if ($user === null) return view('index');

        // ゲーム情報を取得
        $games = $this->getOwnedGames($user['steamID64']);
        return view('log', ['user' => $user, 'games' => $games]);
    }

    /**
     * ユーザの持っているゲームを取得する
     *
     * @param string $steamId
     * @return array ゲーム情報リスト
     */
    private function getOwnedGames($steamId)
    {
        $url = 'http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=' . $this->apiKey . '&steamid=' . $steamId . '&format=json&include_appinfo=1';
        $response = $this->guzzleClient->get($url);
        $json = json_decode($response->getBody(), true);
        return $json['response']['games'];
    }
}

Viewを適当に作ります。

ログイン前はこんな感じ。

f:id:gunsou_911:20181212221239p:plain

ログインするとこんな感じになります。

f:id:gunsou_911:20181212224307p:plain

ふむー

f:id:gunsou_911:20181212224443p:plain

ちゃんとログアウトもできます。

f:id:gunsou_911:20181212224537p:plain

たーのしー!

今日はここまでにしましょう。

次回はDI(Dependency Injection:依存性の注入)を使って遊んでみます。

CakePHPにはない要素なので楽しみ。

それではー

Laravelを始めてみる

この記事は「mikage-labアドベントカレンダー」の9日目の記事です。

前日は小旅行記でしたが、プログラマなので技術的なところも醸し出して行きたいと思います。

普段のお仕事では、CakePHPやらを使ってますが、Laravelの隆盛を見ると遊んでみたいなーという気持ちが湧いてきたので遊んでみます。

SteamのAPIでなにか遊ぶ予定です。予定なのでどうなるかはわかりません。

とりあえず、Laravelドキュメント見ながら環境構築してみます。

Windows10 XAMPP環境でやってます。

以下、コマンドは注記がなければ、Windowsコマンドプロンプトを使っています。

まずはlaravelのインストーラーをダウンロード。 composerでお手軽ダウンロードできるのホントいいですね。

xampp> composer global require laravel/installer

XAMPPで動かしているので、htdocsに配下にプロジェクトを作ります。

htdocsまで移動してからプロジェクトを作成。

Steamの遊んだ履歴を表示したいという魂胆が見え見えのプロジェクトを作ります。

xampp/htdocs> laravel new steam_play_log

早速XAMPPを起動させて http://localhost/steam_play_log でアクセス。

f:id:gunsou_911:20181209134357p:plain

なるほど。htdocsに直はダメそうですね。いろいろ見えちゃっています。

以下、Laravelドキュメント#インストール から抜粋

Publicディレクト

Laravelをインストールできたら、Webサーバのドキュメント/Webルートがpublicディレクトリになるように設定してください。このディレクトリのindex.phpは、アプリケーションへ送信された、全HTTPリクエストを始めに処理するフロントコントローラとして動作します。

プロジェクトは xampp/htdocs に直置きはやめたほうが良さそうです。

ここを参考にします。

Laravelのドキュメントルートを変更する - Laravel学習帳

ということで、プロジェクトを別のところで作り直します。 XAMPPから見えないところにプロジェクトを作りましょう。

(XAMPPから見えないところ)> laravel new steam_play_log

そしてxampp/htdocsに移動して、シンボリックリンクを作成。

xampp/htdocs> mklink /d steam_play_log (プロジェクトの場所)/public

http://localhost/steam_play_logでアクセスしてみます。

f:id:gunsou_911:20181209135323p:plain

できました。

CakePHPは xampp/htdocs にプロジェクト直置きで大丈夫でしたが、Laravelではそうもいかないみたいですね。

次はOpenIDを使ってSteamに接続したいと思います。

野火止用水めぐり

この記事は「mikage-labアドベントカレンダー」の8日目の記事です。

野火止用水新河岸川から玉川上水までクロスバイクで上ってみました。

f:id:gunsou_911:20181201105316j:plain

新河岸川からスタート。秋晴れで良い感じ。 まずは紅葉を見に平林寺へ。

f:id:gunsou_911:20181201122012j:plain

平林寺。駐車場少なめなのか、バス利用者がかなり多い。 交通の便的にもクロスバイクで来て正解だった感。

紅葉が素晴らしい。日に当たると鮮やかになってよいですね。

緑・黄・赤が季節の変わり目の可視化という感じでお気に入りの1枚。

f:id:gunsou_911:20181201125200j:plain

境内の雑木林。

ちょうど蝶が活動している季節・時間帯らしく、ずっと眺めていると風景の手前から奥まで太陽の照り返しで蝶の翅が瞬いていて不思議な風景…でしたが、写真にするとちょっとダメですね。全くわからない。

こういうずっと眺める感じのものはなんやかんや自身の目の解像度で見たほうが良いと思ってまして、早々に撮影を放棄したりすることがままあります。

今回の小旅行の個人的体感1位だったんですが、伝えるとなるとなかなか難しいですね。まぁいいや。

f:id:gunsou_911:20181201154125j:plain

所変わって玉川上水近くの線路。野火止用水の写真が無い?日没が結構早くて急ぎ足だったので写真撮ってません。タイトルとは…

そのまま村山上ダムへ。

f:id:gunsou_911:20181201163127j:plain

日没までの短時間、空が紫色になる瞬間があるのですが、急ぎ足だったのもこの風景を見るため。どうせなら空が広く見える場所でということで。

自分の中のバイブルとして「ヨコハマ買い出し紀行」という漫画があるのですが、ここらへんの時間帯の色合いを「藤色のフィルター」と表現してます。

主人公は短時間で移りゆく色合いに感じ入りカメラのシャッターを押さなかったという、非常にエモい感じのエピソードなのですが、言葉の表現が秀逸ですね。

その後は、輪転して帰宅。初輪転だったのですが、なかなか移動が大変でした…慣れの問題ですかね。