2019/07/12
「LaravelでSSOのAPIを作成する」シリーズの第二回です。
前回はイントロをエントリーしました。
今回はSSOのAPIを作成します。
仕様
SSOのAPI は Laravel で構築していきます。
ログイン画面で「メールアドレス」「パスワード」をPOST送信し、API側でリクエストを受け取って DB と照合をかけるスクリプトを書きます。
結果はJSON形式 ( response()->json
) に変換して返します。
クライアント側ではJSONだと使いにくいので StdClass に変換して結果を使います。
APIの作成
手順
1)Laravelのインストール&設定
Laravel のインストールや設定については、すでにこのブログでいくつかエントリーしているので割愛します。
【参照】Laravel ローカル環境構築(for XAMPP)
cd C:\xampp\htdocs
composer create-project "laravel/laravel=5.2.*" ssoapi
2)DB&モデルの作成
1.マイグレーションファイルの作成
とりあえず、デフォルトでついているマイグレーションファイルを使います。
そのままマイグレーションコマンドを実行。
$ php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
2.シーダーファイルの作成
usersテーブルの「ユーザー名」「email」「パスワード」をデモを入力します。
public function run()
{
\DB::table('users')->insert([
'name' => 'デモ ユーザー',
'email' => 'demo@gmail.com',
'password' => 'secret',
]);
}
細かい手順については以下を参照してください。
3.モデルの作成
Userテーブルを操作するモデルを作成します。
php artisan make:model Models/User
artisanコマンドで生成されたスケルトンを編集。
Userモデルはデフォルトで用意されているものがありますが、それは利用せず新規で作成します。
カラムにデータを挿入できるようにします。
protected $table = 'users';
protected $primaryKey = 'id';
protected $fillable = [
'name'
, 'email'
, 'password'
];
細かい手順については以下を参照してください。
3)コントローラの作成
artisanコマンドでコントローラのスケルトンを作成。
php artisan make:controller UserController
自動生成されたコントローラを編集します。
// Requestファサードを利用するためにエイリアス作成
use Request;
class UserController extends Controller
{
//
public function login()
{
// 初期設定
$result = false;
$message = '';
// リクエスト取得
$id = Request::input('id');
$password = Request::input('password');
if(empty($id))
{
$message = 'not input id';
}elseif(empty($password))
{
$message = 'not input password';
}else{
// id & pass あり → データ検索
if(strstr($id, '@')) // "@" があるかチェック
{
$findData = \App\Models\User::where('email', $id)->where('password',$password)->first();
}
if(empty($findData))
{
// レコードなし
$message = 'nothing';
}else{
// レコードあり
$result = true;
}
}
// レスポンス生成
if($result)
{
// 該当レコードありの処理
$response = response()->json(
[
'result' => $result
,'id' => $findData->id
,'email' => $findData->email
,'password' => $findData->password
,'name' => $findData->name
,'message' => 'ログイン成功!'
]
);
}else{
//該当レコードなしの処理
$response = response()->json(
[
'result' => $result
,'message' => $message
]
);
}
return $response;
}
4)ルーティングの作成
http://localhost/practice_sso/public/login
でアクセスしたら UserController の login メソッド実行
Route::post('login', 'UserController@login');
5)特定ルートの csrf_token のチェックを無効
Laravelの場合、外部から POST される場合、csrf_token のチェックを無効にする必要があります。
app/Http/Middleware/VerifyCsrfToken.php
の $except に除外する URI を追加します。
# app\Http\Middleware\VerifyCsrfToken.php
:
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
protected $except = [
'login/', // csrf_tokenを除外するURIを記述
];
}
URIの記述箇所ですが、必要に応じてワイルドカード ( * ) も指定が可能です。
'login/*'
API側の作業は以上になります。
次回はクライアント側の作成をします。
PHPフレームワーク Laravel入門
僕がはじめてLaravelを学習するために参考にしたサイトは、掌田津耶乃(しょうだつやの)さんの libro というサイトです。当時(2016年)、Laravel学習サイトの中でもこのサイトは群を抜いてわかりやすく説明されていたので、とても勉強になったのを覚えています。この本は掌田津耶乃が書いた本なので、わかりやすく解説されているだろうと kindle で購入しました。2019年7月の時点でいうと日本国内にて唯一の Laravel の良書と言っても良いかと思います。しかし、かなりわかりやすく解説されているとはいえ、PHP中級者以上のスキルは必要です。PHP自体の知識が乏しい方は独習PHP 第3版をあわせて購入することをお勧めします。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。