Skip to content

Instantly share code, notes, and snippets.

@brickgale
Last active November 5, 2019 03:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brickgale/2a4c4b310db7b42b2e43492e9bebb646 to your computer and use it in GitHub Desktop.
Save brickgale/2a4c4b310db7b42b2e43492e9bebb646 to your computer and use it in GitHub Desktop.
Laravel 5.4 with Laravel Socialite
<?php
namespace App\Http\Controllers\Auth;
use JWTAuth;
use Socialite;
use App\User;
use App\Transformers\UserTransformer;
use App\Http\Controllers\Controller;
use Tymon\JWTAuth\Exceptions\JWTException;
use Illuminate\Http\Request;
class LoginController extends Controller
{
/**
* Authenticate User Via Provider
*
* @param provider
* @return Response
*/
public function authenticateViaProvider(Request $request)
{
$credentials = $request->only('provider', 'id', 'token');
$providerUser = Socialite::driver($credentials['provider'])
->userFromToken($credentials['token']);
if($providerUser) {
$o_user = User::findByProvider($credentials['provider'], $credentials['id'], $credentials['token'])->first();
if($o_user) {
$token = JWTAuth::fromUser($o_user);
if($o_user->isActivated()) {
$user = $this->transformItem($o_user, new UserTransformer);
return $this->response->array(compact('token','user'))->setStatusCode(200);
}
}
}
return $this->response->errorUnauthorized('Token is not valid');
}
}
<?php
namespace App\Http\Controllers\Auth;
use Socialite;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class SocialController extends Controller
{
/**
* Array of allowed providers
*
* @var string
*/
protected $providers = [
'facebook'
];
/**
* Array of scopes for providers
*
* @var string
*/
protected $scopes = [
'facebook' => [
'user_birthday',
'user_location'
]
];
/**
* Array of fields for providers
*
* @var string
*/
protected $fields = [
'facebook' => [
'first_name',
'last_name',
'email',
'gender',
'birthday',
'location'
]
];
/**
* Redirect the user to the Facebook authentication page.
*
* @param provider
* @return Response
*/
public function redirectToProvider($provider)
{
if($this->isProviderAllowed($provider)) {
return Socialite::driver($provider)
->scopes($this->scopes[$provider])
->fields($this->fields[$provider])
->redirect();
}
return redirect()->to('/');
}
/**
* Obtain the user information from Facebook.
*
* @param provider
* @return Response
*/
public function handleProviderCallback(Request $request, $provider)
{
if (!$request->has('code') || $request->has('denied')) {
return redirect()->to('/');
}
if($this->isProviderAllowed($provider)) {
$providerUser = Socialite::driver($provider)
->fields($this->fields[$provider])
->user();
$user = User::findByProviderId($provider, $providerUser->id)->first();
if($user) {
//already a user
if($provider == 'facebook') {
$user->facebook_id = $providerUser->id;
$user->facebook_token = $providerUser->token;
$user->save();
}
$s_route = 'sign-in?'.
'provider='.$provider.
'&provider_id='.$providerUser->id.
'&provider_token='.$providerUser->token;
} else {
$s_route = 'sign-up?'.
'first_name='.$providerUser->user['first_name'].
'&last_name='.$providerUser->user['last_name'].
'&gender='.$providerUser->user['gender'].
'&provider='.$provider.
'&provider_id='.$providerUser->id.
'&provider_token='.$providerUser->token;
if(isset($providerUser->user['email'])) {
$s_route.='&email='.$providerUser->user['email'];
}
if(isset($providerUser->user['birthday'])) {
$s_route.='&birthday='.$providerUser->user['birthday'];
}
}
return redirect()->to($s_route);
}
return redirect()->to('/');
}
/**
* Check for provider allowed and services configured
*
* @param $provider
* @return bool
*/
private function isProviderAllowed($provider)
{
return in_array($provider, $this->providers) && config()->has("services.{$provider}");
}
}
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use Notifiable;
use SoftDeletes;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'first_name', 'last_name', 'email', 'status', 'password', 'facebook_id', 'facebook_token', 'password_reset'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
//relationships
//scopes
public function scopeFindByEmail($query, $email) {
return $query->where('email', $email);
}
public function scopeFindByProvider($query, $provider, $provider_id, $provider_token) {
return $query->where($provider.'_id', $provider_id)
->where($provider.'_token', $provider_token);
}
public function scopeFindByProviderId($query, $provider, $provider_id) {
return $query->where($provider.'_id', $provider_id);
}
}
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('auth/redirect/{provider}', 'Auth\SocialController@redirectToProvider');
Route::get('auth/handler/{provider}', 'Auth\SocialController@handleProviderCallback');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment