● ルータの修正
前回はソーシャルログインを提供しているプロバイダごとにルーターを指定しましたが、以下のようにまとめるとスッキリする上に新たにプロバイダが増えた場合も対処が楽です。
routes/web.php
Route::get('auth/{provider}', 'Auth\AuthController@RedirectToProvider');
Route::get('auth/{provider}/callback', 'Auth\AuthController@CallbackFromProvider');
app/Http/Controllers/Auth/AuthController.php
/**
* ソーシャルログインのプロバイダへリダイレクトします
*
* @param string $provider ('twitter' or 'google' or 'facebook' )
*/
public function RedirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
/**
* ソーシャルログインのプロバイダからのコールバック
*
* @param string $provider ('twitter' or 'google' or 'facebook' )
*/
public function CallbackFromProvider($provider)
{
//ユーザー情報を取得
$social = Socialite::driver($provider)->user();
$user = $this->findOrCreateUser($provider, $social->id, $social);
auth()->login($user, true);
return redirect()->to('/home');
}
/**
* このメソッドはソーシャルログインしたユーザーがデータベース上になければ作成して返します
*
* @param string $socialFlg ( 'twitter' or 'facebook' or 'google' )
* @param string $userId
* @param object $userObj
*
* @return object ユーザモデル
*/
private function findOrCreateUser($socialFlg, $userId, $userObj)
{
$checkUser = User::where('social_id_name', "{$socialFlg}_{$userId}")->first();
if ($checkUser) {
return $checkUser;
}
$user = User::create([
'name' => $userObj->getName(),
'social_kbn' => 1,
'social_id_name' => "{$socialFlg}_{$userId}",
'social_avatar_name' => $userObj->getAvatar(),
]);
}
これで http://あなたのサーバ名/auth/プロバイダ名/ で任意のプロバイダでソーシャルログイン出来るようにルーターにセットしました。
ただ、この場合だと ユーザーがありもしないプロバイダ名( 例えばhogehoge)でアクセスする可能性があります。
その際にエラー表示となるようエラー設定をします。
● Laravelでエラーページを表示させる
1. エラーハンドラを修正
app\Exceptions\Handler.phpを修正します。
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
↓ 下記のように変更します
public function render($request, Exception $exception)
{
if($this->isHttpException($exception)) {
if($exception->getStatusCode() == 403) {
return response()->view('errors.403');
}
if($exception->getStatusCode() == 404) {
return response()->view('errors.404');
}
return response()->view('errors.500');
}
return parent::render($request, $exception);
}
2. エラーページのビューを作成
resources/views/errors/404.blade.php にエラーページのhtml 404.html , 403.htmlを作成します。
resources/views/errors/404.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="jumbotron">
<div class="text-center"></div>
<h1 class="text-center">404 Not Found</h1>
<small class="text-center"> Oh noes everything broke</small>
<p class="text-center">Try pressing the back button or clicking on this button.</p>
<p class="text-center"><a class="btn btn-primary" href="#"><i class="fa fa-home"></i> Take Me Home</a></p>
</div>
</div>
@endsection
resources/views/errors/403.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="jumbotron">
<div class="text-center"></div>
<h1 class="text-center">403 Error</h1>
<p class="text-center small">{{ $message }}</p>
<p class="text-center">Try pressing the back button or clicking on this button.</p>
<p class="text-center"><a class="btn btn-primary" href="#"><i class="fa fa-home"></i> Take Me Home</a></p>
</div>
</div>
@endsection
403.blade.php の方はエラーメッセージ内容を {{ $message }} で表示できるようにしています。
● http://あなたのサーバ名/auth/hogehoge/ など有りもしないプロバイダ名でアクセスされたときにエラー表示を行う
AuthController.php のRedirectToProvider() を次のように変更し、configにないプロバイダ名でのアクセス時にエラー表示へ遷移させます。
app/Http/Controllers/Auth/AuthController.php
/**
* ソーシャルログインのプロバイダへリダイレクトします
*
* @param string $provider ('twitter' or 'google' or 'facebook' )
*/
public function RedirectToProvider($provider)
{
$configProvider = config('services.'.$provider);
if ( $configProvider ){
return Socialite::driver($provider)->redirect();
} else {
abort('403', "プロバイダ({$provider})の設定が存在しません。");
}
}
以上です。
ログイン後のログアウトはそのままLaravelのAuthを使用することができますので特に作成する必要はありません。
便利ですね。