Webアプリ習作#8
前記事に引き続き主にこちらを参考にしました。 Laravel Socialiteを使ってTwitterアカウントでログイン機能 - Crieit
モデルのディレクトリ構成の変更
Laravelのプロジェクト作成時にUserモデルのファイル(User.php)がapp直下に自動生成されるが、app/Modelsディレクトリを作成しその下に移動させる それに伴いUser.phpの中身も変更
namespace App; ↓ namespace App\Models;
また、プロジェクトディレクトリ以下を検索して
App\User
と書かれている箇所を
App\Models\User
に置換する 具体的には以下の三か所 app\Http\Controllers\Auth\RegisterController.php
use App\User; ↓ use App\Models\User;
config\auth.php
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], ↓ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ],
database\factories\UserFactory.php
use App\User; ↓ use App\Models\User;
social_usersに対応するモデル作成
プロジェクトディレクトリで以下コマンドを実行
php artisan make:model Models/SocialUser
app\ModelsにSocialUser.phpが生成されたことを確認 app\Models\User.phpに以下のメソッドを追加してSocialUserモデルと連携
public function socialUsers() { return $this->hasMany(SocialUser::class); }
app\Models\SocialUser.phpの方にも以下を追加
class SocialUser extends Model { public function user() { return $this->belongsTo(User::class); } }
これでusersとsocial_usersが連携される
callbackメソッドの実装
app\Http\Controllers\TwitterAuthController.phpに以下のuseキーワードの記述を追加
// ここからを追加. use App\Models\User; use App\Models\SocialUser; use Auth; use DB; // ここまでを追加. use Illuminate\Http\Request; use Socialite;
同じくapp\Http\Controllers\TwitterAuthController.phpのcallbackメソッドを修正
public function callback() { $providerUser = Socialite::driver('Twitter')->user(); // 既存ユーザーか. $socialUser = SocialUser::where('provider_user_id', $providerUser->id)->first(); if ($socialUser) { // 既存ユーザーならログインしてトップページへ. Auth::login($socialUser->user, true); return redirect('/'); } // 新しいユーザーを作成. $user = new User(); $user->unique_id = $providerUser->nickname; $user->name = $providerUser->name; $user->avatar = $providerUser->user['profile_image_url_https']; $user->bio = $providerUser->user['description']; $socialUser = new SocialUser(); $socialUser->provider_user_id = $providerUser->id; DB::transaction(function () use ($user, $socialUser) { $user->save(); $user->socialUsers()->save($socialUser); }); // 作成したユーザーでログイン. Auth::login($user, true); return redirect('/'); }
アクセス確認
ローカルサーバを起動してログインURLにアクセス
http://localhost:8000/auth/twitter
Twitterのアプリケーション認証画面を介してLaravelのホーム画面へ移行することを確認
DBを確認
psqlを起動してDBに接続
\c twiapp_db
テーブル一覧を表示してユーザー情報が一人分生成されていることを確認
select * from users; select * from social_users;
再度ログイン確認
もう一度ログインURLにアクセスして正常にログインできることを確認 その後DBにアクセスしてデータが複数生成されていないことも確認