はじめに
Laravelでアニメの聖地の写真を共有するサイトを作ったのですが、サイトへのログインとしてTwitterログイン機能を利用したので方法を書いていきたいと思います。
作ったサイトはこちらです。
右上のログインから試せます。
前提
- Laravel version 5.6
- Twitter Developerの登録済み
Socialiteの設定
TwitterログインはSocialiteというライブラリを利用します。
まずはインストール。
composer require laravel/socialite
インストール後はconfig/app.php
にprovidersとaliasの設定をします。
'providers' => [
Laravel\Socialite\SocialiteServiceProvider::class,
],
'aliases' => [
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
]
次に、config/services.php
にTwitterのトークンなどを設定します。
値は適宜変更してください。
"twitter" => [
"client_id" => env("TWITTER_CLIENT_ID"),
"client_secret" => env("TWITTER_CLIENT_SECRET"),
"redirect" => env("CALLBACK_URL"),
]
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と同じです。
// ログイン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の標準の認証機能を使っています。
<?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をサポートしているので、他のも試してみようと思います。