This commit is contained in:
Adrian Hopek
2022-01-12 15:28:48 +01:00
parent 2abd83526d
commit 197e7da9cc
22 changed files with 994 additions and 1895 deletions

View File

@@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
namespace Toby\Http\Controllers;
use Illuminate\Contracts\Auth\Factory as AuthFactory;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Toby\Models\User;
use Laravel\Socialite\SocialiteManager;
use Symfony\Component\HttpFoundation\RedirectResponse;
class GoogleController extends Controller
{
public function redirect(SocialiteManager $socialiteManager): RedirectResponse
{
return $socialiteManager->driver("google")->redirect();
}
public function callback(AuthFactory $auth, SocialiteManager $socialiteManager): RedirectResponse
{
$socialUser = $socialiteManager->driver("google")->user();
try {
/** @var User $user */
$user = User::query()
->where("email", $socialUser->getEmail())
->firstOrFail();
$auth->guard()->login($user, true);
$user->syncGoogleData($socialUser);
return redirect()->route("dashboard");
} catch (ModelNotFoundException) {
return redirect()
->route("login")
->withErrors([
"oauth" => __("User does not exist."),
]);
}
}
}

View File

@@ -8,10 +8,8 @@ use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
protected function redirectTo($request)
protected function redirectTo($request): ?string
{
if (!$request->expectsJson()) {
return route("login");
}
return route("login");
}
}

View File

@@ -11,7 +11,17 @@ class HandleInertiaRequests extends Middleware
{
public function share(Request $request): array
{
$user = $request->user();
return array_merge(parent::share($request), [
"auth" => fn() => [
"user" => $user ? [
"name" => $user->name,
"email" => $user->email,
"role" => "Human Resources Manager",
"imageUrl" => $user->avatar,
] : null,
],
"flash" => fn() => [
"success" => $request->session()->get("success"),
"error" => $request->session()->get("error"),

View File

@@ -8,7 +8,6 @@ use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
use Toby\Providers\RouteServiceProvider;
class RedirectIfAuthenticated
{
@@ -18,7 +17,7 @@ class RedirectIfAuthenticated
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
return redirect()->route("login");
}
}

View File

@@ -7,7 +7,15 @@ namespace Toby\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Socialite\Two\User as SocialUser;
/**
* @property int $id
* @property string $name
* @property string $email
* @property string $avatar
* @property string $google_id
*/
class User extends Authenticatable
{
use HasFactory;
@@ -16,15 +24,22 @@ class User extends Authenticatable
protected $fillable = [
"name",
"email",
"password",
];
protected $hidden = [
"password",
"remember_token",
];
protected $casts = [
"email_verified_at" => "datetime",
];
public function syncGoogleData(SocialUser $user): void
{
$this->name = $user->getName();
$this->avatar = $user->getAvatar();
$this->google_id = $user->getId();
$this->save();
}
}

View File

@@ -12,8 +12,6 @@ use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
public const HOME = "/home";
public function boot(): void
{
$this->configureRateLimiting();