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のアクセストークンが直書きされている
一通りの動作が確認出来たら不要なので削除する