2022-09-20 21:59:52 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Auth;
|
|
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
2024-08-19 15:22:57 +02:00
|
|
|
use App\Integrations\OAuth\OAuthProviderService;
|
2022-09-20 21:59:52 +02:00
|
|
|
use App\Models\OAuthProvider;
|
|
|
|
|
use App\Models\User;
|
2024-08-19 15:22:57 +02:00
|
|
|
use App\Models\Workspace;
|
2022-09-20 21:59:52 +02:00
|
|
|
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
|
|
|
|
|
|
|
|
|
class OAuthController extends Controller
|
|
|
|
|
{
|
|
|
|
|
use AuthenticatesUsers;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create a new controller instance.
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
config([
|
|
|
|
|
'services.github.redirect' => route('oauth.callback', 'github'),
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Redirect the user to the provider authentication page.
|
|
|
|
|
*
|
2024-02-23 11:54:12 +01:00
|
|
|
* @param string $provider
|
2022-09-20 21:59:52 +02:00
|
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
|
|
|
*/
|
2024-08-19 15:22:57 +02:00
|
|
|
public function redirect(OAuthProviderService $provider)
|
2022-09-20 21:59:52 +02:00
|
|
|
{
|
2024-08-19 15:22:57 +02:00
|
|
|
return response()->json([
|
|
|
|
|
'url' => $provider->getDriver()->setRedirectUrl(config('services.google.auth_redirect'))->getRedirectUrl()
|
|
|
|
|
]);
|
2022-09-20 21:59:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Obtain the user information from the provider.
|
|
|
|
|
*
|
2024-02-23 11:54:12 +01:00
|
|
|
* @param string $driver
|
2022-09-20 21:59:52 +02:00
|
|
|
* @return \Illuminate\Http\Response
|
|
|
|
|
*/
|
2024-08-19 15:22:57 +02:00
|
|
|
public function handleCallback(OAuthProviderService $provider)
|
2022-09-20 21:59:52 +02:00
|
|
|
{
|
2024-08-19 15:22:57 +02:00
|
|
|
try {
|
|
|
|
|
$driverUser = $provider->getDriver()->setRedirectUrl(config('services.google.auth_redirect'))->getUser();
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
return $this->error([
|
|
|
|
|
"message" => "OAuth service failed to authenticate: " . $e->getMessage()
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
$user = $this->findOrCreateUser($provider, $driverUser);
|
|
|
|
|
|
|
|
|
|
if (!$user) {
|
|
|
|
|
return $this->error([
|
|
|
|
|
"message" => "User not found."
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($user->has_registered) {
|
|
|
|
|
return $this->error([
|
|
|
|
|
"message" => "This email is already registered. Please sign in with your password."
|
|
|
|
|
]);
|
|
|
|
|
}
|
2022-09-20 21:59:52 +02:00
|
|
|
|
|
|
|
|
$this->guard()->setToken(
|
|
|
|
|
$token = $this->guard()->login($user)
|
|
|
|
|
);
|
|
|
|
|
|
2024-08-19 15:22:57 +02:00
|
|
|
return response()->json([
|
2022-09-20 21:59:52 +02:00
|
|
|
'token' => $token,
|
|
|
|
|
'token_type' => 'bearer',
|
|
|
|
|
'expires_in' => $this->guard()->getPayload()->get('exp') - time(),
|
2024-08-19 15:22:57 +02:00
|
|
|
'new_user' => $user->new_user
|
2022-09-20 21:59:52 +02:00
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2024-08-19 15:22:57 +02:00
|
|
|
* @p aram \Laravel\Socialite\Contracts\User $socialiteUser
|
|
|
|
|
* @return \App\Models\User | null
|
2022-09-20 21:59:52 +02:00
|
|
|
*/
|
2024-08-19 15:22:57 +02:00
|
|
|
protected function findOrCreateUser($provider, $socialiteUser)
|
2022-09-20 21:59:52 +02:00
|
|
|
{
|
|
|
|
|
$oauthProvider = OAuthProvider::where('provider', $provider)
|
2024-08-19 15:22:57 +02:00
|
|
|
->where('provider_user_id', $socialiteUser->getId())
|
2022-09-20 21:59:52 +02:00
|
|
|
->first();
|
|
|
|
|
|
|
|
|
|
if ($oauthProvider) {
|
|
|
|
|
$oauthProvider->update([
|
2024-08-19 15:22:57 +02:00
|
|
|
'access_token' => $socialiteUser->token,
|
|
|
|
|
'refresh_token' => $socialiteUser->refreshToken,
|
2022-09-20 21:59:52 +02:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
return $oauthProvider->user;
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-19 15:22:57 +02:00
|
|
|
|
|
|
|
|
if (!$provider->getDriver()->canCreateUser()) {
|
|
|
|
|
return null;
|
2022-09-20 21:59:52 +02:00
|
|
|
}
|
|
|
|
|
|
2024-08-19 15:22:57 +02:00
|
|
|
$email = strtolower($socialiteUser->getEmail());
|
|
|
|
|
$user = User::whereEmail($email)->first();
|
|
|
|
|
|
|
|
|
|
if ($user) {
|
|
|
|
|
$user->has_registered = true;
|
|
|
|
|
return $user;
|
|
|
|
|
}
|
2022-09-20 21:59:52 +02:00
|
|
|
|
|
|
|
|
$user = User::create([
|
2024-08-19 15:22:57 +02:00
|
|
|
'name' => $socialiteUser->getName(),
|
|
|
|
|
'email' => $email,
|
2022-09-20 21:59:52 +02:00
|
|
|
'email_verified_at' => now(),
|
|
|
|
|
]);
|
|
|
|
|
|
2024-08-19 15:22:57 +02:00
|
|
|
// Create and sync workspace
|
|
|
|
|
$workspace = Workspace::create([
|
|
|
|
|
'name' => 'My Workspace',
|
|
|
|
|
'icon' => '🧪',
|
2022-09-20 21:59:52 +02:00
|
|
|
]);
|
|
|
|
|
|
2024-08-19 15:22:57 +02:00
|
|
|
$user->workspaces()->sync([
|
|
|
|
|
$workspace->id => [
|
|
|
|
|
'role' => User::ROLE_ADMIN,
|
|
|
|
|
],
|
|
|
|
|
], false);
|
|
|
|
|
$user->new_user = true;
|
|
|
|
|
|
|
|
|
|
OAuthProvider::create(
|
|
|
|
|
[
|
|
|
|
|
'user_id' => $user->id,
|
|
|
|
|
'provider' => $provider,
|
|
|
|
|
'provider_user_id' => $socialiteUser->getId(),
|
|
|
|
|
'access_token' => $socialiteUser->token,
|
|
|
|
|
'refresh_token' => $socialiteUser->refreshToken,
|
|
|
|
|
'name' => $socialiteUser->getName(),
|
|
|
|
|
'email' => $socialiteUser->getEmail(),
|
|
|
|
|
]
|
|
|
|
|
);
|
2022-09-20 21:59:52 +02:00
|
|
|
return $user;
|
|
|
|
|
}
|
|
|
|
|
}
|