LoginSignup
13
10

More than 5 years have passed since last update.

LaravelのSocialiteを利用してTwitterソーシャルログイン実装

Last updated at Posted at 2017-02-21

Socialiteとは?

今までCakePHP2を使用してきた@solt9029です。
Laravelは物凄く使いやすくて感動しています。
PHPのフレームワークであるLaravelにおける超便利なソーシャルログイン用のライブラリ的なものです。
どのくらい簡単かというとTOEICで250点を獲得するくらい簡単です。
本記事ではSocialiteを使用してTwitterログインを実装します。
その際、あらかじめVagrantとVirtualBoxをインストールし、homesteadというLaravelの提供する仮想環境を構築した状態を想定しています。
以下の公式のチュートリアルが参考になります。
【Laravel 5.1 Laravel Homestead】 https://readouble.com/laravel/5.1/ja/homestead.html

使用するバージョン

  • Laravel 5.1.*
  • Socialite 2.0.9

Socialiteを入れる

まずはSocialiteをLaravelに入れます。

composer require laravel/socialite:2.0.9

続いて、config/app.phpを開いてproviders配列に以下を追加します。

app.php
Laravel\Socialite\SocialiteServiceProvider::class,

同様に、config/app.phpの中のaliases配列に以下を追加します。

app.php
'Socialite' => Laravel\Socialite\Facades\Socialite::class,

これで下準備完了です!

Twitterアプリ登録

Twitterのアプリ登録をしてください。
その際に、callbackURLは「 (自分の設定したホスト名)/auth/twitter/callback 」としてください。
ここではsocialite-tutorial.appとしています。
確かlocalhostは利用できませんのでご注意ください。
ConsumerKeyとConsumerSecretを使用します。

定数の設定

.envファイルに以下を足してください。

TWITTER_CLIENT_ID=(あなたのconsumerkey)
TWITTER_CLIENT_SECRET=(あなたのconsumersecret)
CALLBACK_URL=http://socialite-tutorial.app/auth/twitter/callback

config/services.phpを開いて配列に以下の項目を足してください。

services.php
"twitter"=>[
    "client_id"=>env("TWITTER_CLIENT_ID"),
    "client_secret"=>env("TWITTER_CLIENT_SECRET"),
    "redirect"=>env("CALLBACK_URL"),
]

ルーティング

app/Http/routes.phpに以下の設定をします。

routes.php
Route::get('/', function () {
    return view('welcome');
});

Route::get('auth/twitter', 'Auth\AuthController@redirectToProvider');
Route::get('auth/twitter/callback', 'Auth\AuthController@handleProviderCallback');
Route::get("auth/twitter/logout","Auth\AuthController@getLogout");

Route::get("home",array("as"=>"home","uses"=>function(){
    return view("home");
}));

マスアサインメントの設定

app/User.phpの$fillableを変更します。
Userモデルがデフォルトであるのが素晴らしいですね。

User.php
protected $fillable=["name","nickname","twitter_id","avatar"];

AuthControllerの設定

app/Http/Controllers/Auth/AuthController.phpを開いてnamespaceの利用を付け足します。

AuthController.php
use Auth;
use Socialite;

またAuthControllerに以下のプロパティとアクションを付け足します。

AuthController.php
    protected $redirectPath = '/home';

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

    public function handleProviderCallback(){
        try {
            $user = Socialite::driver('twitter')->user();
        } catch (Exception $e) {
            return redirect('auth/twitter');
        }
        $authUser = $this->findOrCreateUser($user);
        Auth::login($authUser, true);
        return redirect()->route('home');
    }

    private function findOrCreateUser($twitterUser){
        $authUser = User::where('twitter_id', $twitterUser->id)->first();
        if ($authUser){
            return $authUser;
        }
        return User::create([
            'name' => $twitterUser->name,
            'nickname' => $twitterUser->nickname,
            'twitter_id' => $twitterUser->id,
            'avatar' => $twitterUser->avatar_original
        ]);
    }

マイグレーションの設定

まだマイグレートしてないと思うので、もともとあるapp/database/migrations/create_user_table.phpをいじっちゃいます。

create_user_table.php
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('nickname');
        $table->string("twitter_id")->unique();
        $table->string("avatar");
        $table->rememberToken();
        $table->timestamps();
    });
}

テンプレートファイルの編集

てきとーにログイン用のリンクを張っておくといいかなと思います。
resources/views/welcome.blade.phpのどこかに付け足してください。

welcome.blade.php
<a href="auth/twitter">twitter login</a>

またログイン後のページも作っちゃいましょう。
resources/views/home.blade.phpという感じでファイルを作ってください。

home.blade.php
<html>
    <head>
        <title>Laravel</title>
    </head>
    <body>
        <h4>your name is {{ Auth::user()->name }}</h4>
        <h4>your twitter nickname is {{ Auth::user()->nickname }}</h4>
        <div><img src="{{ Auth::user()->avatar }}" height="200" width="200"></div>
        <a href="auth/twitter/logout">twitter logout</a>
    </body>
</html>

マイグレーション実行

以下のコマンドでマイグレーションを行います。
既にマイグレーション済みとかだったらrollbackしてください。

php artisan migrate

これで http://socialite-tutorial.app から試してみてください!!

おわりに

CakePHP2で実装していたらなかなかだるかったのですが、Laravelだとすぐ出来てしまいました。
素晴らしい…。

13
10
4

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
13
10