けいくん@keikun 2020年02月12日 18:53

【cakephp3】steamアカウントでログイン認証

php cakephp3 OpenID steam steam_api

概要

steamアカウントでよくあるTwitterなどのようにソーシャルログイン実装をしたい。

使ったもの

cakephp3
Steam Web API
OpenID(LightOpenID)

作る

Steam Web API
https://steamcommunity.com/dev

このURLにOpenIDの紹介があるので、飛んでみると色々あるようだが
Googleで検索した結果、LightOpenIDがよさげなのでこれを使う。

LightOpenID 導入

cpmposerで導入するので、インストールしてない場合は、composer インストールしてください。紹介は省く。

composer.json
    "repositories":[
        {
            "type": "vcs",
            "url": "https://github.com/iignatov/LightOpenID"
        }
    ],
    "require": {
        "php": ">=5.6",
        "iignatov/lightopenid": "*"
    },

上記を正しい場所に記入してもらったら、composer updateでインストール。
cmd
composer update

登録

SteamController.php
    public function index()
    {
        $this->autoRender = FALSE;
        $openid = new LightOpenID("https://". $_SERVER["HTTP_HOST"]. "/auth/steam");
        $openid->identity = "http://steamcommunity.com/openid";
        $openid->returnUrl = "https://". $_SERVER["HTTP_HOST"]. "/auth/steam/callback";

        if($openid->mode === null) return $this->redirect($openid->authUrl());
    }

画面はいらないので、なくす
SteamController.php
$this->autoRender = FALSE;
newをする際に認証のアクセス先の指定
今回は /auth/steam にする。
SteamController.php
$openid = new LightOpenID("https://". $_SERVER["HTTP_HOST"]. "/auth/steam");
steamはこれっぽいので同じものを入れたらいいと思う。
SteamController.php
        $openid->identity = "http://steamcommunity.com/openid";
返ってくるURLのデフォルトがnewで指定たものになるが
別にしたい場合は$openid->returnUrlで指定。
SteamController.php
$openid->returnUrl = "https://". $_SERVER["HTTP_HOST"]. "/auth/steam/callback";
認証先がauthUrl()なので、下記のようにリダイレクトをさせる。
SteamController.php
if($openid->mode === null) return $this->redirect($openid->authUrl());
SteamController.php -> callback
    public function callback()
    {
        $this->autoRender = FALSE;
        $openid = new LightOpenID("https://". $_SERVER["HTTP_HOST"]. "/auth/steam");
        $openid->identity = "http://steamcommunity.com/openid";
        $openid->returnUrl = "https://". $_SERVER["HTTP_HOST"]. "/auth/steam/callback";

        $steam_id = str_replace('https://steamcommunity.com/openid/id/', '', $this->request->getQuery('openid_identity'));
        $user = $this->TUsers->find()->where(['steam_id' => $steam_id]);

        if(empty($this->Auth->user()) && $user->isEmpty()) return $this->registry($steam_id);
        if(!empty($this->Auth->user()) && $user->isEmpty()) return $this->cooperation($steam_id);
        if(empty($this->Auth->user()) && !$user->isEmpty()) return $this->login($user);
        if(!empty($this->Auth->user()) && !$user->isEmpty()) return $this->release();

        $this->render('/Auth/complete');
    }
今回は登録なのでユーザー登録とログインしてない場合に登録する
SteamController.php
        if(empty($this->Auth->user()) && $user->isEmpty()) return $this->registry($steam_id);
SteamController.php -> registry
    protected function registry($steam_id)
    {
        $steam_user_json = file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=[steam_web_api_key]&steamids={$steam_id}");
        $steam_user = json_decode($steam_user_json);
        $steam_user = $steam_user->response->players[0];

        $users_entity = $this->TUsers->newEntity([
            "user_id" => uniqid(),
            "name" => $steam_user->personaname,
            "image" => $steam_user->avatar,
            "steam_id" => $steam_id,
        ]);
        if($this->TUsers->save($users_entity)) {
            $this->Auth->setUser($users_entity);
            return $this->redirect("/{$users_entity->user_id}");
        } else {
            echo '失敗';
        }
    }
steamのuser情報が欲しいのでSteam Web APIを使う
使う際はアクセスキーが必要なので取得してくる
https://steamcommunity.com/dev
上記のURL簡単に取得できる。
習得したアクセスキーを[steam_web_api_key]を置き換える。
SteamController.php
        $steam_user_json = file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=[steam_web_api_key]&steamids={$steam_id}");

そのあとはcakephp3のデータ追加なので割愛。
違う部分などは好きなように変えてください。

のこりの連携と解除とログインに関しては特に難しいこともないので割愛。
必要な場合言ってもらえれば残りも載せるかも。

それじゃまた

関連記事

  • Unity WebAPIを使ってデータを扱う けいくん @keikun

  • コメント

    コメントがありません。

    コメント

    コメントがありません。