Using Laravel Socialite to login to facebook
In your composer.json add- "laravel/socialite": "~2.0",
"require": { "laravel/framework": "5.0.*", "laravel/socialite": "~2.0",
the run composer update
In config/services.php add:
//Socialite 'facebook' => [ 'client_id' => '1234567890444', 'client_secret' => '1aa2af333336fffvvvffffvff', 'redirect' => 'http://laravel.dev/login/callback/facebook', ],
You need to create two routes, mine are like these:
//Social LoginRoute::get('/login/{provider?}',[ 'uses' => 'AuthController@getSocialAuth', 'as' => 'auth.getSocialAuth']);Route::get('/login/callback/{provider?}',[ 'uses' => 'AuthController@getSocialAuthCallback', 'as' => 'auth.getSocialAuthCallback']);
You also need to create controller for the routes above like so:
<?php namespace App\Http\Controllers; use Laravel\Socialite\Contracts\Factory as Socialite; class AuthController extends Controller { public function __construct(Socialite $socialite){ $this->socialite = $socialite; } public function getSocialAuth($provider=null) { if(!config("services.$provider")) abort('404'); //just to handle providers that doesn't exist return $this->socialite->with($provider)->redirect(); } public function getSocialAuthCallback($provider=null) { if($user = $this->socialite->with($provider)->user()){ dd($user); }else{ return 'something went wrong'; } } }
and finally add Site URL to your Facebook App like so:
Update 2018 - laravel 5.6 - socialite 3.0
It's little bit tricky for something that looks/should be easy, but anyway this is how i make things works for me.
Server side
you can find those instructions and more details in socialite docs
Installation
composer require laravel/socialite
Configuration
in config/services.php add
'facebook' => [ 'client_id' => env('FACEBOOK_CLIENT_ID'), 'client_secret' => env('FACEBOOK_CLIENT_SECRET'), 'redirect' => env('FACEBOOK_CALLBACK_URL'),],
in .env file add
FACEBOOK_CLIENT_ID=paste_client_id_hereFACEBOOK_CLIENT_SECRET=paste_client_secret_hereFACEBOOK_CALLBACK_URL=https://www.example.com/auth/facebook/callback
in routes/web.php add
Route::get('auth/facebook/', 'Auth\FacebookController@redirect')->name('auth.facebook');Route::get('auth/facebook/callback', 'Auth\FacebookController@callback')->name('auth.facebook.callback');
in App\Http\Controllers\Auth add new controller FacebookController.php
<?phpnamespace App\Http\Controllers\Auth;use App\Http\Controllers\Controller;use Illuminate\Http\Request;use App\User;use Socialite;class FacebookController extends Controller { /** * Create a new controller instance. * * @return void */ public function redirect() { return Socialite::driver('facebook')->redirect(); } /** * Create a new controller instance. * * @return void */ public function callback(Request $request) { try { $facebookAccount = Socialite::driver('facebook')->user(); // your logic here... return redirect()->route('your.route.name'); } catch (Exception $e) { return redirect()->route('auth.facebook'); } }}
Facebook side
go to https://developers.facebook.com/apps and create new app (if you don't have one already)
and make sur your app settings are like below in those screen shots:
Important note
If you are developing in your local machine, you have to use tools like ngrok that provide a secure link to your localhost.
In the facebook login settings change https://www.example.com with the url provided by ngrok something like https://8b0215bc.ngrok.io.
It is the only way that worked for me while developing in my local machine.
Create a provider under your config/services.php file
'facebook' => [ 'client_id' => 'your-fb-client-id', 'client_secret' => 'your-fb-secret', 'redirect' => 'http://your-redirect.com/route',],
now you can create a controller with following code
//this function will redirect users to facebook login pagepublic function facebook(){ return \Socialize::with('facebook')->redirect();}public function callback(){ $user = \Socialize::with('facebook')->user(); //now we have user details in the $user array dd($user);}
and this is your route
Route::get('facebook', 'LoginController@facebook');Route::get('callback', 'LoginController@callback');