From 8fd07c11a855d41f61328840eb9602eaa5b572a5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 30 Jun 2021 18:30:34 +0200 Subject: [PATCH] Adding support to login via discord oauth. --- .env.example | 4 ++ app/Http/Controllers/Auth/OAuthController.php | 43 +++++++++++++++++++ app/Models/User.php | 1 + app/Providers/EventServiceProvider.php | 3 ++ config/app.php | 1 + config/services.php | 7 +++ resources/icons/discord-text-white.svg | 23 ++++++++++ resources/views/auth/login.blade.php | 12 ++++++ routes/oauth.php | 16 +++++++ routes/web.php | 2 + 10 files changed, 112 insertions(+) create mode 100644 app/Http/Controllers/Auth/OAuthController.php create mode 100644 resources/icons/discord-text-white.svg create mode 100644 routes/oauth.php diff --git a/.env.example b/.env.example index 44853cd..77ccb8b 100644 --- a/.env.example +++ b/.env.example @@ -49,3 +49,7 @@ PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +DISCORD_CLIENT_ID = +DISCORD_CLIENT_SECRET = +DISCORD_REDIRECT_URI = diff --git a/app/Http/Controllers/Auth/OAuthController.php b/app/Http/Controllers/Auth/OAuthController.php new file mode 100644 index 0000000..d6c4aad --- /dev/null +++ b/app/Http/Controllers/Auth/OAuthController.php @@ -0,0 +1,43 @@ +redirect(); + } + + /** + * Handle callback from OAuth driver. + * + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request, $driver) + { + $oauth = Socialite::driver($driver)->stateless()->user(); + + $user = User::firstOrCreate([ "{$driver}_id" => $oauth->getId() ], [ + 'username' => $oauth->getNickname() + ]); + + Auth::guard('web')->login($user, true); + + $request->session()->regenerate(); + + return redirect('/'); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 37e34b6..b3dc880 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -17,6 +17,7 @@ class User extends Authenticatable * @var array */ protected $fillable = [ + 'discord_id', 'username', 'password', 'role' diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index a9f10a6..a008b87 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -18,6 +18,9 @@ class EventServiceProvider extends ServiceProvider Registered::class => [ SendEmailVerificationNotification::class, ], + \SocialiteProviders\Manager\SocialiteWasCalled::class => [ + 'SocialiteProviders\\Discord\\DiscordExtendSocialite@handle', + ] ]; /** diff --git a/config/app.php b/config/app.php index 906f887..90080c2 100644 --- a/config/app.php +++ b/config/app.php @@ -165,6 +165,7 @@ return [ /* * Package Service Providers... */ + SocialiteProviders\Manager\ServiceProvider::class, /* * Application Service Providers... diff --git a/config/services.php b/config/services.php index 2a1d616..59e9934 100644 --- a/config/services.php +++ b/config/services.php @@ -30,4 +30,11 @@ return [ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], + 'discord' => [ + 'client_id' => env('DISCORD_CLIENT_ID'), + 'client_secret' => env('DISCORD_CLIENT_SECRET'), + 'redirect' => env('DISCORD_REDIRECT_URI', '/oauth/discord/callback'), + 'allow_gif_avatars' => false, + 'avatar_default_extension' => 'jpg', + ], ]; diff --git a/resources/icons/discord-text-white.svg b/resources/icons/discord-text-white.svg new file mode 100644 index 0000000..2cef077 --- /dev/null +++ b/resources/icons/discord-text-white.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index f13e919..b564e97 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -8,4 +8,16 @@ + @if (config('services.discord.client_id')) +
+
+
OR
+
+
+ + + + + @endif + diff --git a/routes/oauth.php b/routes/oauth.php new file mode 100644 index 0000000..b6e43da --- /dev/null +++ b/routes/oauth.php @@ -0,0 +1,16 @@ +where([ 'driver' => collect($drivers)->join('|') ]) + ->name('oauth.')->group(function () { + + Route::get('/', [ OAuthController::class, 'create' ])->name('create'); + Route::get('/callback', [ OAuthController::class, 'store' ])->name('store'); +}); diff --git a/routes/web.php b/routes/web.php index 27aa353..5f3ddc4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,6 +10,8 @@ use App\Http\Controllers\RecipeController; use App\Http\Controllers\Auth\SessionController; +require "oauth.php"; + /* |-------------------------------------------------------------------------- | Web Routes