最近LaravelのSocialiteを使ってTwitterログインをWebアプリに実装するところを試していたのですが、うまく動作したので今回は実装方法をご紹介したいと思います。
まずはTwitter APIの取得が必要になるので、Twitterの開発者ページから申請・APIトークン取得を行います。
APIトークンが発行されたら、コールバックURLも設定しておきます。
ここまで出来たら、Laravel側にTwitterログインを実装していきます。
ここでは、下記3点を前提として進めていきます。
・すでにインターネット経由でアクセスできるサーバーにLaravelが動作可能な状態でインストールされている
・DBにユーザー情報を登録するテーブルが追加済み
・ユーザー情報テーブルのmodelが作成済み
Laravel自体のセットアップ方法は下記を参照してください。
まず、Laravelのプロジェクト内へ移動した後、composerでSNS認証プラグインのsocialiteをインストールしておきます。
cd /path/to/laravel #Laravelがインストールされているプロジェクト(フォルダ)のパス
composer require laravel/socialite #socialiteのインストール
これでSNS認証プラグインがLaravelにインストールされました。
次にコントローラーにログイン時の処理を記述していきます。
LaravelでTwitterログインを実装する – Qiita
例として下記に上記のサイトを参考に自分が書いたソースを掲載します。
<?php
//ネームスペース設定
namespace App\Http\Controllers\Auth;
// プラグインのインポート
use App\Http\Controllers\Controller;
use App\Model\User; //ユーザー情報テーブルEloquentモデル
use \File; //ファイル操作プラグイン
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage; //Storageプラグイン(ファイルの保存などに必要)
use Laravel\Socialite\Facades\Socialite; //先程インストールしたSNS認証プラグイン
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');
}
// Webアプリへのログイン処理
// TwitterのidがすでにWebアプリのDB上に登録されていないかを確認
$user = User::where('user_id', $twitterUser->id)->first();
//オリジナルサイズのプロフィール画像取得
$original_url = str_replace("_normal.", ".", $twitterUser->user['profile_image_url_https']);
// 新しいプロフィール画像を保存
$prof_icon_path = $this->_putProfileImage($twitterUser->id, $original_url);
// 新規ユーザーの場合
if (!$user) {
User::create([ //TwitterAPIから取得したユーザー情報をDBに突っ込む
// 配列のキー: DBテーブルのカラム名
'user_id' => $twitterUser->id, //TwitterID(同一アカウントであれば変更不可のもの。アカウントの同定に使用)
'screen_name' => $twitterUser->nickname, //TwitterログインID
'view_name' => $twitterUser->name, //表示上のTwitterユーザー名
'description' => $twitterUser->user['description'], //プロフィール
'user_icon_path' => $prof_icon_path, //先程保存したアイコン画像のパス
]);
// 突っ込んだユーザー情報をDBから再取得(Webアプリ側のログイン処理に必要)
$user = User::where('user_id', $twitterUser->id)->first();
} else {
// ユーザー情報がすでにある場合
// ID以外の新しいユーザー情報を登録
// 左辺の書式: $モデル名->DBテーブルのカラム名
$user->screen_name = $twitterUser->nickname; //TwitterログインID
$user->view_name = $twitterUser->name; //表示上のTwitterユーザー名
$user->description = $twitterUser->user['description']; //プロフィール
$user->user_icon_path = $prof_icon_path; //先程保存したアイコン画像のパス
$user->save(); //DB更新
}
//共通処理
Auth::login($user); //Webアプリにログイン
return redirect('/'); //TOPへリダイレクト
}
// ログアウト
public function logout(Request $request)
{
// ログアウト処理
Auth::logout();
return redirect('/');
}
private function _putProfileImage($userid, $photo_url)
{
$img = file_get_contents($photo_url); //プロフィール画像のバイナリをTwitterから取得
$img_ext = $this->_getImageTypes($photo_url); //取得したバイナリから拡張子を推定
//画像を保存
$prof_icon_path = 'proficons/' . $userid . '.' . $img_ext; //保存パス定義(proficons/ユーザーid.拡張子)
if (File::exists($prof_icon_path)) { //すでに指定パスに画像がある場合
Storage::delete($prof_icon_path); //上書きできないため一旦消す
}
Storage::disk('local')->put($prof_icon_path, $img); //Twitterから取得した画像をサーバーに保存
return $prof_icon_path; //保存パスを返す
}
//画像バイナリから拡張子を推定する関数(mimetypeを使用)
private function _getImageTypes($photo_url)
{
//getimagesize関数で画像情報を取得する
list($img_width, $img_height, $mime_type, $attr) = getimagesize($photo_url);
//list関数の第3引数にはgetimagesize関数で取得した画像のMIMEタイプが格納されているので条件分岐で拡張子を決定する
switch ($mime_type) {
//jpegの場合
case IMAGETYPE_JPEG:
//拡張子の設定
$img_extension = "jpg";
break;
//pngの場合
case IMAGETYPE_PNG:
//拡張子の設定
$img_extension = "png";
break;
//gifの場合
case IMAGETYPE_GIF:
//拡張子の設定
$img_extension = "gif";
break;
}
// 拡張子の出力
return $img_extension;
}
}
次にルートを指定します。
// TwitterログインURL
Route::get('login/twitter', 'Auth\TwitterController@redirectToProvider'); //標準ログインにそろえて
// TwitterコールバックURL
Route::get('auth/twitter/callback', 'Auth\TwitterController@handleProviderCallback');
// TwitterログアウトURL
Route::get('auth/twitter/logout', 'Auth\TwitterController@logout');
ログインURLを”login/twitter”にしてあるのは、単純にLaravelのログインURLとそろえたかっただけで、”auth/twitter/login”としても大丈夫です。
2番目の”TwitterコールバックURL”の部分については、Twitterの管理画面側で指定したURLと一致している必要があります。
それでは実際にTwitterログインのテストを行ってみます。
上記の例であれば、”https://ドメイン名/login/twitter”にアクセスします。
するの下記のような見慣れた画面にリダイレクトします。
あとはここでTwitterへログインする際の情報を入力すれば、先程指定したCallbackURLに対してログインしたユーザーの登録情報が返却されます。
そこから入手できる情報から、自サイトで会員登録に必要な情報を抜き出してDBなどに保存する処理を記述すれば、Twitterログイン機能の完成です。
あとはTwitterログインボタンをログイン画面などに設置して、TwitterログインのURLに誘導すればOKです。
なお、上記の例ではサービスの会員管理とSNSログインの会員管理を同じテーブルで扱っていますが、実際に運用する場合はどこかでTwitterのIDと自サイトのIDが重複して困ったことになる可能性があるので、TwitterIDは別テーブルで管理して、自サイトの独自IDと紐づけておくほうが安心です。
Laravel上でSNSログインを実装したい方の参考になれば幸いです。