0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel6でTwitterログインを実装する

Last updated at Posted at 2021-01-01

この記事ではLaravel6でTwitterログインを実装する手順を解説していきます。

メモ程度ですが、悪しからず。

Twitter Developerの登録

まずはTwitter Developerにてアプリを作成してください。

env.ファイルの作成

とりあえずTwitterAPIを使う時の初期設定。

TWITTER_CLIENT_ID=
TWITTER_CLIENT_SECRET=
TWITTER_CLIENT_ID_ACCESS_TOKEN =
TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET =
CALLBACK_URL=http://127.0.0.1:8000/login/twitter/callback

空白の箇所は自分のやつを入れる。

config/service.phpに処理追加

今回は必要ないけど、とりあえず追加しておく。
envファイルから呼び出すわけにはいかないので、config経由するための記述。

'twitter' => [
       'client_id' => env('TWITTER_CLIENT_ID'),
       'client_secret' => env('TWITTER_CLIENT_SECRET'),
       'access_token' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN', ''),
       'access_token_secret' => env('TWITTER_CLIENT_ID_ACCESS_TOKEN_SECRET', ''),
       'redirect' => env('CALLBACK_URL')
    ],

config/appに処理追加

下記を追加する。
サービスプロバイダへ登録して、コンテナに登録する。
あとエイリアスにも追加する。

    'providers' => [
        ~省略~
        Laravel\Socialite\SocialiteServiceProvider::class, //Socialiteを使う設定

    ],

    'aliases' => [
        ~省略~
        'Socialite' => Laravel\Socialite\Facades\Socialite::class,//Socialiteを使う設定

    ],

Socialiteをインストール

composer require laravel/socialite

SocialiteについてはLaravel6ドキュメントを見るべし。

ルーティングの追加

Route::get('login/twitter', 'Auth\LoginController@redirectToTwitterProvider');
Route::get('login/twitter/callback', 'Auth\LoginController@handleTwitterProviderCallback');

Loginコントローラーに処理を追加

とりあえずここまで。

    use Socialite;

    ~省略~

    public function redirectToTwitterProvider()
   {
       return Socialite::driver('twitter')->redirect();
   }

    public function handleTwitterProviderCallback()
    {
        $user = Socialite::driver('Twitter')->user();
        dd($user);
    }

テーブルの作成

php artisan make:migration create_social_users --create social_users

中身は次の通り。

Schema::create('social_users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('user_id')->unsigned()->index();
            $table->string('provider_user_id')->index();
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });

usersテーブルの拡張

php artisan make:migration add_social_columns_to_users --table users

中身は次の通り。

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('unique_id')->after('id');
            $table->string('avatar')->after('password');
            $table->text('bio')->after('avatar');
            $table->string('email')->nullable()->change();
            $table->string('password')->nullable()->change();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('password')->change();
            $table->string('email')->change();
            $table->dropColumn('bio');
            $table->dropColumn('avatar');
            $table->dropColumn('unique_id');
        });
    }

マイグレーションの実行

下記をインストール。
カラム属性を変更する時は必要。

composer require doctrine/dbal

もしエラーが出たら、バージョンを指定すればOK。

次にマイグレーション実行。

php artisan migrate

モデルの作成

php artisan make:model SocialUser

リレーションも追加しておく。 まずはUserモデル。
    public function socialUsers()
    {
        return $this->hasMany(SocialUser::class);
    }

下記も。

    public function user()
    {
        return $this->belongsTo(User::class);
    }

Loginコントローラーに処理追加。

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use App\User;
use App\SocialUser;
use Auth;
use DB;

use Socialite;

class LoginController extends Controller
{

    use AuthenticatesUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function redirectToTwitterProvider()
    {
        return Socialite::driver('twitter')->redirect();
    }

    public function handleTwitterProviderCallback()
    {
        $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('/');
    }
}

参考

Laravel Socialiteを使ってTwitterアカウントでログイン機能
Laravel6.0+SocialiteでTwitterログインを実装する

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?