Socialiteとは?
今までCakePHP2を使用してきた@solt9029です。
Laravelは物凄く使いやすくて感動しています。
PHPのフレームワークであるLaravelにおける超便利なソーシャルログイン用のライブラリ的なものです。
どのくらい簡単かというとTOEICで250点を獲得するくらい簡単です。
本記事ではSocialiteを使用してTwitterログインを実装します。
その際、あらかじめVagrantとVirtualBoxをインストールし、homesteadというLaravelの提供する仮想環境を構築した状態を想定しています。
以下の公式のチュートリアルが参考になります。
【Laravel 5.1 Laravel Homestead】 https://readouble.com/laravel/5.1/ja/homestead.html
使用するバージョン
- Laravel 5.1.*
- Socialite 2.0.9
Socialiteを入れる
まずはSocialiteをLaravelに入れます。
composer require laravel/socialite:2.0.9
続いて、config/app.phpを開いてproviders配列に以下を追加します。
Laravel\Socialite\SocialiteServiceProvider::class,
同様に、config/app.phpの中のaliases配列に以下を追加します。
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
これで下準備完了です!
Twitterアプリ登録
Twitterのアプリ登録をしてください。
その際に、callbackURLは「 (自分の設定したホスト名)/auth/twitter/callback 」としてください。
ここではsocialite-tutorial.appとしています。
確かlocalhostは利用できませんのでご注意ください。
ConsumerKeyとConsumerSecretを使用します。
定数の設定
.envファイルに以下を足してください。
TWITTER_CLIENT_ID=(あなたのconsumerkey)
TWITTER_CLIENT_SECRET=(あなたのconsumersecret)
CALLBACK_URL=http://socialite-tutorial.app/auth/twitter/callback
config/services.phpを開いて配列に以下の項目を足してください。
"twitter"=>[
"client_id"=>env("TWITTER_CLIENT_ID"),
"client_secret"=>env("TWITTER_CLIENT_SECRET"),
"redirect"=>env("CALLBACK_URL"),
]
ルーティング
app/Http/routes.phpに以下の設定をします。
Route::get('/', function () {
return view('welcome');
});
Route::get('auth/twitter', 'Auth\AuthController@redirectToProvider');
Route::get('auth/twitter/callback', 'Auth\AuthController@handleProviderCallback');
Route::get("auth/twitter/logout","Auth\AuthController@getLogout");
Route::get("home",array("as"=>"home","uses"=>function(){
return view("home");
}));
マスアサインメントの設定
app/User.phpの$fillableを変更します。
Userモデルがデフォルトであるのが素晴らしいですね。
protected $fillable=["name","nickname","twitter_id","avatar"];
AuthControllerの設定
app/Http/Controllers/Auth/AuthController.phpを開いてnamespaceの利用を付け足します。
use Auth;
use Socialite;
またAuthControllerに以下のプロパティとアクションを付け足します。
protected $redirectPath = '/home';
public function redirectToProvider(){
return Socialite::driver('twitter')->redirect();
}
public function handleProviderCallback(){
try {
$user = Socialite::driver('twitter')->user();
} catch (Exception $e) {
return redirect('auth/twitter');
}
$authUser = $this->findOrCreateUser($user);
Auth::login($authUser, true);
return redirect()->route('home');
}
private function findOrCreateUser($twitterUser){
$authUser = User::where('twitter_id', $twitterUser->id)->first();
if ($authUser){
return $authUser;
}
return User::create([
'name' => $twitterUser->name,
'nickname' => $twitterUser->nickname,
'twitter_id' => $twitterUser->id,
'avatar' => $twitterUser->avatar_original
]);
}
マイグレーションの設定
まだマイグレートしてないと思うので、もともとあるapp/database/migrations/create_user_table.phpをいじっちゃいます。
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('nickname');
$table->string("twitter_id")->unique();
$table->string("avatar");
$table->rememberToken();
$table->timestamps();
});
}
テンプレートファイルの編集
てきとーにログイン用のリンクを張っておくといいかなと思います。
resources/views/welcome.blade.phpのどこかに付け足してください。
<a href="auth/twitter">twitter login</a>
またログイン後のページも作っちゃいましょう。
resources/views/home.blade.phpという感じでファイルを作ってください。
<html>
<head>
<title>Laravel</title>
</head>
<body>
<h4>your name is {{ Auth::user()->name }}</h4>
<h4>your twitter nickname is {{ Auth::user()->nickname }}</h4>
<div><img src="{{ Auth::user()->avatar }}" height="200" width="200"></div>
<a href="auth/twitter/logout">twitter logout</a>
</body>
</html>
マイグレーション実行
以下のコマンドでマイグレーションを行います。
既にマイグレーション済みとかだったらrollbackしてください。
php artisan migrate
これで http://socialite-tutorial.app から試してみてください!!
おわりに
CakePHP2で実装していたらなかなかだるかったのですが、Laravelだとすぐ出来てしまいました。
素晴らしい…。