Webアプリ習作#13
TwitterのアクセストークンをDBに保存
前記事の問題はTwitterのアクセストークンをDBに保存することで対応することに social_userテーブルに格納する
social_usersテーブルの拡張
php artisan make:migration add_token_columns_to_social_users --table social_users
[日付]_add_token_columns_to_social_users.phpというファイルが生成されるので編集
/** * Run the migrations. * * @return void */ public function up() { Schema::table('social_users', function (Blueprint $table) { // ここからを追加. $table->string('token')->after('provider_user_id'); $table->string('token_secret')->after('token'); // ここまでを追加. }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('social_users', function (Blueprint $table) { // ここからを追加. $table->dropColumn('token_secret'); $table->dropColumn('token'); // ここまでを追加. }); }
マイグレーションを実行
php artisan migrate
※エラー発生
Illuminate\Database\QueryException : SQLSTATE[23502]: Not null violation: 7 ERROR: column "token" of relation "social_users" contains null values (SQL: alter table "social_users" add column "token" varchar(255) not null, add column "token_secret" varchar(255) not null)
NOT NULL制約付きのカラムのデータにnullが含まれてしまうというエラーが発生 既存のデータがある状態でNOT NULL 制約付きのカラムを追加しようとしているのが原因と思われるので既存のデータを消す
psqlを起動して既存データの削除
\c twiapp_db delete from users;
usersとsocial_users,tweetsは連携しているのでusersのデータを消すとsocial_users,tweetsのデータも消える
マイグレーションを再度実行
php artisan migrate
psqlからsocial_usersを確認
\d social_users;
tokenとtoken_secretのカラムが追加されていることを確認
Twitterログインのcallbackを修正
app\Http\Controllers\TwitterAuthController.phpの以下を修正 追加されたsocial_usersのカラムにデータが格納されるように
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; // ここからを追加. $socialUser->token = $providerUser->token; $socialUser->token_secret = $providerUser->tokenSecret; // ここまでを追加. DB::transaction(function () use ($user, $socialUser) { $user->save(); $user->socialUsers()->save($socialUser); }); Auth::login($user, true); return redirect('/'); }
ツイートを実行する処理を修正
app\Http\Controllers\TweetController.phpの以下を修正
public function store() { //$user = Socialite::driver('Twitter')->user(); // ここを削除. // ここからを追加. $user = Auth::user(); $socialUser = $user->socialUsers()->first(); // ここまでを追加. $twitter = new TwitterOAuth( env('TWITTER_CLIENT_ID'), env('TWITTER_CLIENT_SECRET'), // ここからを修正. $socialUser->token, $socialUser->token_secret ); // ここまでを修正. $body = 'テストツイートです'; $twitter->post("statuses/update", [</br> "status" => $body ]); $tweet = new Tweet(); $tweet->body = $body; $tweet->user_id = Auth::user()->id; $tweet->save(); return redirect('/'); }
動作確認
http://localhost:8000/
にアクセスしてログイン・テストツイート実行を一通り確認
仮画面の削除
resources/views/test.blade.php
にはTwitterのアクセストークンが直書きされている
一通りの動作が確認出来たら不要なので削除する