質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

494閲覧

Laravel Twitter APIを使用してのログインについて

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/09/18 06:15

編集2020/09/21 11:48

前提・実現したいこと

Laravelを使用して作成したサイトにTwitter APIを利用して
ログインをできるようにしたいと考えております。

↓現環境↓
さくらサーバー
PHP:7.4.7
MySQL:5.7
Laravel:5.8
socialite:3.2.0

発生している問題

トップ画面にあるログインボタンを押し、
「~アカウントへのアクセスを許可しますか?」の画面へ移動。

「連携アプリを認証」を選択し、「アプリケーションに戻ります」画面に切り替わり、
そのまま自動でトップ画面に移動するが、ログインは出来ていない状態です。

DBを見るとデータベースへの登録が出来ておらずログインも
出来ない状態なのかなと考えております。
問題改善のためアドバイスをいただけると幸いです。

[表示された画面]

Twitterログイン1
Twitterログイン2

コントローラー[/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 テーブル情報

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問