Skip to content

Instantly share code, notes, and snippets.

@omarkdev
Created December 21, 2016 20:11
Show Gist options
  • Save omarkdev/15b1c76b9737cf834cd48d7bbf66da16 to your computer and use it in GitHub Desktop.
Save omarkdev/15b1c76b9737cf834cd48d7bbf66da16 to your computer and use it in GitHub Desktop.
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use SammyK\LaravelFacebookSdk\LaravelFacebookSdk;
class FacebookController extends Controller
{
/**
* Check user exists
*
* @var bool
*/
protected $userExists = false;
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @param $token
*
* @return static
*/
protected function createOrUpdate(array $data, $token)
{
$user = User::firstOrNew(['email' => $data['email']]);
$user->access_token = (string) $token;
$this->userExists = $user->exists;
if(!$user->exists){
$user->facebook_user_id = $data['id'];
$user->email = $data['email'];
$user->name = $data['name'];
}
$user->save();
return $user;
}
/**
* Authenticate the user
*
* @param $user
*
* @return mixed
*/
protected function authenticate($user)
{
return Auth::login($user);
}
/**
* Go back with _error message
*
* @param $message
*
* @return \Illuminate\Http\RedirectResponse
*/
protected function errorBack($message)
{
return redirect()->back()->with('_error', $message);
}
/**
* Return $graphUser format
*
* @param $graphUser
*
* @return array
*/
protected function formatGraphUser($graphUser)
{
return [
'name' => $graphUser['name'],
'email' => $graphUser['email'],
'id' => $graphUser['id']
];
}
/**
* Register user
*
* @param LaravelFacebookSdk $facebookSdk
*
* @return \Illuminate\Http\RedirectResponse
*/
public function register(LaravelFacebookSdk $facebookSdk)
{
if(Auth::check()){
return redirect()->route('welcome.index');
}
try {
$token = $facebookSdk->getAccessTokenFromRedirect();
} catch (Facebook\Exceptions\FacebookSDKException $e) {
return $this->errorBack('Ocorreu um erro, tente novamente ou se cadastre manualmente.');
}
if(!$token){
return $this->errorBack('Erro ao obter token, tente novamente ou se cadastre manualmente.');
}
if(!$token->isLongLived()){
$oauth_client = $facebookSdk->getOAuth2Client();
try {
$token = $oauth_client->getLongLivedAccessToken($token);
} catch (Facebook\Exceptions\FacebookSDKException $e) {
return $this->errorBack('Erro ao estender o token.');
}
}
$facebookSdk->setDefaultAccessToken($token);
session(['user_facebook_access_token' => (string) $token]);
try {
$response = $facebookSdk->get('/me?fields=id,name,email');
} catch (Facebook\Exceptions\FacebookSDKException $e) {
return $this->errorBack('Erro ao obter suas informações');
}
$graphUser = $this->formatGraphUser($response->getGraphUser());
$this->authenticate($this->createOrUpdate($graphUser, $token));
if(!$this->userExists)
return redirect()->route('welcome.index')->with('_success', 'Seja Bem-Vindo ao Sherlock!');
return redirect()->route('welcome.index');
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment