前提・実現したいこと
Laravelを使用して作成したサイトにTwitter APIを利用して
ログインをできるようにしたいと考えております。
↓現環境↓
さくらサーバー
PHP:7.4.7
MySQL:5.7
Laravel:5.8
socialite:3.2.0
発生している問題
トップ画面にあるログインボタンを押し、
「~アカウントへのアクセスを許可しますか?」の画面へ移動。
「連携アプリを認証」を選択し、「アプリケーションに戻ります」画面に切り替わり、
そのまま自動でトップ画面に移動するが、ログインは出来ていない状態です。
DBを見るとデータベースへの登録が出来ておらずログインも
出来ない状態なのかなと考えております。
問題改善のためアドバイスをいただけると幸いです。
[表示された画面]
コントローラー[/app/Http/Controllers/Auth/SocialAuthController.php]
<?php namespace App\Http\Controllers\Auth; use App\Models\User; use Auth; use Socialite; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; class SocialAuthController extends Controller { // ログイン public function redirectToProvider() { return Socialite::driver('twitter')->redirect(); } // コールバック public function handleProviderCallback() { try { $twitterUser = Socialite::driver('twitter')->user(); } catch (Exception $e) { return redirect('auth/twitter'); } // Webアプリへのログイン処理 // TwitterのidがすでにWebアプリのDB上に登録されていないかを確認 $user = User::where('twitter_id', $twitterUser->twitter_id)->first(); //オリジナルサイズのプロフィール画像取得 $original_url = str_replace("_normal.", ".", $twitterUser->user['profile_image_url_https']); // 新しいプロフィール画像を保存 $prof_icon_path = $this->_putProfileImage($twitterUser->id, $original_url); // 新規ユーザーの場合 if (!$user) { User::create([ //TwitterAPIから取得したユーザー情報をDBに突っ込む // 配列のキー: DBテーブルのカラム名 'twitter_id' => $twitterUser->twitter_id, //TwitterID(同一アカウントであれば変更不可のもの。アカウントの同定に使用) 'screen_name' => $twitterUser->screen_name, //TwitterログインID 'name' => $twitterUser->name, //表示上のTwitterユーザー名 'profile_image' => $prof_icon_path, //先程保存したアイコン画像のパス ]); // 突っ込んだユーザー情報をDBから再取得(Webアプリ側のログイン処理に必要) $user = User::where('twitter_id', $twitterUser->id)->first(); } else { // ユーザー情報がすでにある場合 // ID以外の新しいユーザー情報を登録 // 左辺の書式: $モデル名->DBテーブルのカラム名 $user->screen_name = $twitterUser->screen_name; //TwitterログインID $user->name = $twitterUser->name; //表示上のTwitterユーザー名 $user->profile_image = $prof_icon_path; //先程保存したアイコン画像のパス $user->save(); //DB更新 } //共通処理 Auth::login($user); //Webアプリにログイン return redirect('/shares'); //TOPへリダイレクト } // ログアウト public function logout(Request $request) { // ログアウト処理 Auth::logout(); return redirect('/'); } private function _putProfileImage($userid, $photo_url) { $img = file_get_contents($photo_url); //プロフィール画像のバイナリをTwitterから取得 $img_ext = $this->_getImageTypes($photo_url); //取得したバイナリから拡張子を推定 //画像を保存 $prof_icon_path = 'proficons/' . $userid . '.' . $img_ext; //保存パス定義(proficons/ユーザーid.拡張子) if (File::exists($prof_icon_path)) { //すでに指定パスに画像がある場合 Storage::delete($prof_icon_path); //上書きできないため一旦消す } Storage::disk('local')->put($prof_icon_path, $img); //Twitterから取得した画像をサーバーに保存 return $prof_icon_path; //保存パスを返す } //画像バイナリから拡張子を推定する関数(mimetypeを使用) private function _getImageTypes($photo_url) { //getimagesize関数で画像情報を取得する list($img_width, $img_height, $mime_type, $attr) = getimagesize($photo_url); //list関数の第3引数にはgetimagesize関数で取得した画像のMIMEタイプが格納されているので条件分岐で拡張子を決定する switch ($mime_type) { //jpegの場合 case IMAGETYPE_JPEG: //拡張子の設定 $img_extension = "jpg"; break; //pngの場合 case IMAGETYPE_PNG: //拡張子の設定 $img_extension = "png"; break; //gifの場合 case IMAGETYPE_GIF: //拡張子の設定 $img_extension = "gif"; break; } // 拡張子の出力 return $img_extension; } }
モデル[/app/Models/User.php]
<?php namespace App\Models; use Illuminate\Notifications\Notifiable; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'screen_name', 'name', 'profile_image', 'email', 'password', 'twitter_id' ]; public function followers() { return $this->belongsToMany(self::class, 'followers', 'followed_id', 'following_id'); } public function follows() { return $this->belongsToMany(self::class, 'followers', 'following_id', 'followed_id'); } public function getAllUsers(Int $user_id) { return $this->Where('id', '<>', $user_id)->paginate(5); } // フォローする public function follow(Int $user_id) { return $this->follows()->attach($user_id); } // フォロー解除する public function unfollow(Int $user_id) { return $this->follows()->detach($user_id); } // フォローしているか public function isFollowing(Int $user_id) { return (boolean) $this->follows()->where('followed_id', $user_id)->first(['id']); } // フォローされているか public function isFollowed(Int $user_id) { return (boolean) $this->followers()->where('following_id', $user_id)->first(['id']); } public function updateProfile(Array $params) { if (isset($params['profile_image'])) { $file_name = $params['profile_image']->store('public/profile_image/'); $this::where('id', $this->id) ->update([ 'screen_name' => $params['screen_name'], 'name' => $params['name'], 'profile_image' => basename($file_name), 'email' => $params['email'], ]); } else { $this::where('id', $this->id) ->update([ 'screen_name' => $params['screen_name'], 'name' => $params['name'], 'email' => $params['email'], ]); } return; } }
DB テーブル情報
あなたの回答
tips
プレビュー