Laravel Socialiteを利用してFacebook, Twitter, Google+の認証処理を共通化できた
現在、作成している3PS(3Dプリンター共有サービス)はFacebook, Twitter, Google+のアカウントを持っている人であればだれでもご利用できます。 後日ですが各SNSアカウントを持ってなくてもメールアドレス、パスワード登録で独自アカウント作成の機能も追加します。
各SNSのログイン認証の処理はLaravelのSocialiteライブラリを使ってやっています。
Socialiteは各SNSのログイン認証の処理を共通化してほぼ同じコードでやってくれるという凄まじく便利なライブラリです。この3PSのように他のSNSアカウントを利用(寄生?)してるサービスでは神様のようなライブラリです。Socialiteを利用して3社のログイン認証の開発で3時間程度かかったとすると、もしこれが無ければ、10倍ぐらい開発で時間かかったと思います。(各SNSのSDKを落として仕様を理解したりの時間)
で! どんな風に使うといえば
参考にしたサイト
madroom project: Laravel SocialiteでFacebookとTwitterの認証をしてみた
■composerでSocialiteのインストール
composer.json
{ "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "type": "project", "require": { "laravel/framework": "5.0.*", "facebook/php-sdk": "dev-master", "barryvdh/laravel-debugbar": "~2.0", "laravelcollective/html": "~5.0", "intervention/image": "dev-master", "intervention/imagecache": "~2.1" "laravel/socialite": "~2.0", //この行を追加 }, //省略 }
■各SNSのAPIキーを取得
これは各SNSのディベロッパー登録をして取得してください。 省略
■services.phpにAPIキーを登録
app/config/services.php
services.phpに取得したAPIキー、シークレットキーを記述。
redirectには認証後にコールバックされるurlを記述します。
'facebook' => [ 'client_id' => 'xxxxxxxxxx', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'redirect' => url('/facebook/callback'), ], 'twitter' => [ 'client_id' => 'xxxxxxxxxx', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'redirect' => url('/twitter/callback'), ], 'google' => [ 'client_id' => 'xxxxxxxxxx', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'redirect' => url('/google/callback'), ],
■処理部分
routes.php
//Facebookログイン認証のURL Route::get('/facebook', 'FacebookController@getLogin'); //認証後にコールバックされるURL Route::get('/facebook/callback', 'FacebookController@getCallback');
FacebookController.php
ログイン認証時、認証後に実行する処理などを記述する
<?php namespace App\Http\Controllers; use Laravel\Socialite\Contracts\Factory as Socialite; //省略 class FacebookController extends Controller { /** * @var Socialite */ protected $socialite; /** * * */ public function __construct(Socialite $socialite) { $this->socialite = $socialite; } /** * * */ public function getLogin() { //ここで各SNSを設定する return $this->socialite->driver('facebook')->redirect(); } /** * * */ public function getCallback() { //認証後にここがコールバックされます。 $fuser = $this->socialite->driver('facebook')->user(); $fuser->getId(); //facebookのユーザID $fuser->getName(); //facebook上の名前 $fuser->getEmail(); //メールアドレス //あとはお好きに!! //facebookのIDと自分のサービスのユーザIDを紐づける処理などを記述してください $user = User::where('app_id', $fuser->getId())->first(); if(!$user) { //自分のuserテーブル登録されていないユーザなので新規ユーザ //ユーザ登録の処理 } else { //facebookのIDからユーザアカウント(自分のサービス)を取得できたのでログインの処理をする //ログイン Auth::login($user); } } }