ABO ファクトリーのブログ

3PS(3Dプリンター共有)サービスの開発 趣味のプログラム。3Dプリンターを利用した作品を行うサークルとして活動していきたいと思います。

Laravel Socialiteを利用してFacebook, Twitter, Google+の認証処理を共通化できた

現在、作成している3PS(3Dプリンター共有サービス)はFacebook, Twitter, Google+のアカウントを持っている人であればだれでもご利用できます。 後日ですが各SNSアカウントを持ってなくてもメールアドレス、パスワード登録で独自アカウント作成の機能も追加します。 

f:id:abofactory:20150523011920j:plain


SNSのログイン認証の処理はLaravelのSocialiteライブラリを使ってやっています。

Socialiteは各SNSのログイン認証の処理を共通化してほぼ同じコードでやってくれるという凄まじく便利なライブラリです。この3PSのように他のSNSアカウントを利用(寄生?)してるサービスでは神様のようなライブラリです。Socialiteを利用して3社のログイン認証の開発で3時間程度かかったとすると、もしこれが無ければ、10倍ぐらい開発で時間かかったと思います。(各SNSSDKを落として仕様を理解したりの時間)


で! どんな風に使うといえば

参考にしたサイト
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",	//この行を追加
	},
//省略
}

■各SNSAPIキーを取得
これは各SNSディベロッパー登録をして取得してください。 省略



■services.phpAPIキーを登録
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);
		}
		
	}
}