PHP
Twitter
Laravel
TwitterAPI
Socialite

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


はじめに

Laravelでアニメの聖地の写真を共有するサイトを作ったのですが、サイトへのログインとしてTwitterログイン機能を利用したので方法を書いていきたいと思います。

作ったサイトはこちらです。 

右上のログインから試せます。


前提


  • Laravel version 5.6

  • Twitter Developerの登録済み


Socialiteの設定

TwitterログインはSocialiteというライブラリを利用します。

まずはインストール。

composer require laravel/socialite

インストール後はconfig/app.phpにprovidersとaliasの設定をします。


config/app.php

'providers' => [ 

Laravel\Socialite\SocialiteServiceProvider::class,
],
'aliases' => [
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
]

次に、config/services.phpにTwitterのトークンなどを設定します。

値は適宜変更してください。


config/services.php

"twitter" => [

"client_id" => env("TWITTER_CLIENT_ID"),
"client_secret" => env("TWITTER_CLIENT_SECRET"),
"redirect" => env("CALLBACK_URL"),
]


.env

TWITTER_CLIENT_ID = TwitterのApi Key

TWITTER_CLIENT_SECRET = TwitterのAPI Secret Key
CALLBACK_URL = コールバックURL


Laravel

設定が完了したら次はルーティングを実装していきます。

routes/web.phpにログインURLとコールバックURLとログアウトURLを足します。

このコールバックURLはconfig/services.phpで利用するコールバックURLと同じです。


routes/web.php

// ログインURL

Route::get('auth/twitter', 'Auth\TwitterController@redirectToProvider');
// コールバックURL
Route::get('auth/twitter/callback', 'Auth\TwitterController@handleProviderCallback');
// ログアウトURL
Route::get('auth/twitter/logout', 'Auth\TwitterController@logout');

コントローラーはログイン、コールバック、ログアウトを実装します。

Socialite::driver('twitter')->user();で返ってくるオブジェクトはTwitterのアカウント名や、画像URLなどなどかなり多くの情報を持っています。

例で書いているのはLaravelの標準の認証機能を使っています。


TwitterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Socialite;

class TwitterController 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');
}
// 各自ログイン処理
// 例
// $user = User::where('auth_id', $twitterUser->id)->first();
// if (!$user) {
// $user = User::create([
// 'auth_id' => $twitterUser->id
// ]);
// }
// Auth::login($user);
return redirect('/');
}

// ログアウト
public function logout(Request $request)
{
// 各自ログアウト処理
// 例
// Auth::logout();
return redirect('/');
}
}


ビュー側は単純で、各URLに遷移させるだけで大丈夫です。

<a href="/auth/twitter">ログイン</a>

<a href="/auth/twitter/logout">ログアウト</a>


終わりに

Twitter Developerの登録が英語で行う必要があり、そこに苦労したくらいで

Laravel側の実装は簡単でした。

SocialiteはTwitterの他にも、Facebook、LinkedIn、Google、GitHub、Bitbucketをサポートしているので、他のも試してみようと思います。