Skip to content

Instantly share code, notes, and snippets.

@dammyammy
Forked from lukepolo/oauth_controller
Created February 16, 2017 16:51
Show Gist options
  • Save dammyammy/86dc6db4376debed0adb455b2577136d to your computer and use it in GitHub Desktop.
Save dammyammy/86dc6db4376debed0adb455b2577136d to your computer and use it in GitHub Desktop.
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\NotificationProvider;
use App\Models\RepositoryProvider;
use App\Models\Server\Provider\ServerProvider;
use App\Models\User\User;
use App\Models\User\UserLoginProvider;
use App\Models\User\UserNotificationProvider;
use App\Models\User\UserRepositoryProvider;
use App\Models\User\UserServerProvider;
use App\SocialProviders\TokenData;
use Bitbucket\API\Http\Listener\OAuthListener;
use Bitbucket\API\Users;
use Illuminate\Http\Request;
use Socialite;
class OauthController extends Controller
{
/**
* Handles provider requests.
*
* @param $provider
*
* @return mixed
*/
public function newProvider($provider)
{
$scopes = null;
$providerDriver = Socialite::driver($provider);
return $providerDriver->redirect();
}
/**
* Handles the request from the provider.
*
* @param Request $request
* @param $provider
* @return mixed
*/
public function getHandleProviderCallback(Request $request, $provider)
{
try {
$user = Socialite::driver($provider)->user();
if (! \Auth::user()) {
if (! $userProvider = UserLoginProvider::has('user')->where('provider_id',
$user->getId())->first()
) {
$newLoginProvider = $this->createLoginProvider($provider, $user);
$newUserModel = $this->createUser($user, $newLoginProvider);
\Auth::loginUsingId($newUserModel->id);
} else {
\Auth::loginUsingId($userProvider->user->id);
}
}
return redirect()->intended('/');
} catch (\Exception $e) {
if (! empty($newLoginProvider)) {
$newLoginProvider->delete();
}
if (! empty($newUserModel)) {
$newUserModel->delete();
}
return redirect(\Auth::check() ? url('/profile') : '/login')->withErrors($e->getMessage());
}
}
/**
* Creates a new user.
*
* @param $user
* @param UserLoginProvider $userLoginProvider
*
* @throws \Exception
*
* @return mixed
*/
public function createUser($user, UserLoginProvider $userLoginProvider)
{
$userModel = User::create([
'email' => $user->getEmail(),
'name' => empty($user->getName()) ? $user->getEmail() : $user->getName(),
'user_login_provider_id' => $userLoginProvider->id,
]);
return $userModel;
}
/**
* Disconnects a service provider.
*
* @param $providerType
* @param int $serviceID
*
* @return \Illuminate\Http\JsonResponse
*/
public function getDisconnectService($providerType, int $serviceID)
{
if (! empty($userRepositoryProvider = \Auth::user()->userRepositoryProviders->where('id',
$serviceID)->first())
) {
$userRepositoryProvider->delete();
}
return response()->json('OK');
}
/**
* Creates a login provider.
*
* @param $provider
* @param $user
*
* @return mixed
*/
private function createLoginProvider($provider, $user)
{
$userLoginProvider = UserLoginProvider::withTrashed()->firstOrNew([
'provider' => $provider,
'provider_id' => $user->getId(),
]);
$userLoginProvider->fill([
'token' => $user->token,
'expires_in' => isset($user->expiresIn) ? $user->expiresIn : null,
'refresh_token' => isset($user->refreshToken) ? $user->refreshToken : null,
'tokenSecret' => isset($user->tokenSecret) ? $user->tokenSecret : null,
]);
$userLoginProvider->save();
$userLoginProvider->restore();
return $userLoginProvider;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment