slogan3

Ontwerp een Geavanceerde Laravel API Authenticatie met OAuth2 en Sociale Login

description

Met deze prompt kan de gebruiker een modern en veilig authenticatiesysteem ontwerpen dat zowel OAuth2 als sociale login ondersteunt, waardoor de gebruikservaring verbetert en de beveiliging wordt verhoogd. Het voorkomt duplicatie van bestaande prompts die middleware of standaard authenticatiesystemen behandelen, en biedt een uitgebreide aanpak inclusief gebruikersrollen en permissies.

prompt

Help me een geavanceerd authenticatiesysteem in mijn Laravel applicatie te ontwerpen dat OAuth2 ondersteunt voor externe services en sociale login integratie. Specificeer welke OAuth2 providers ik wil gebruiken: <voer hier de gewenste OAuth ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een uitgebreide aanpak voor het ontwerpen van een geavanceerd authenticatiesysteem in je Laravel applicatie met OAuth2 en sociale login integratie: 1. Structuur en componenten opzetten a. Laravel Sanctum of Laravel Passport gebruiken: - Laravel Passport biedt een volledige OAuth2 server implementatie en is geschikt voor deze use-case. - Installeer Laravel Passport via Composer: ```bash composer require laravel/passport ``` - Voer de migraties uit en registreer de Passport service provider: ```bash php artisan migrate php artisan passport:install ``` - Voeg in `AuthServiceProvider` toe: ```php use Laravel\Passport\Passport; public function boot() { $this->registerPolicies(); Passport::routes(); } ``` b. Beveiligingsmaatregelen: - Gebruik HTTPS voor alle communicatie. - Implementeer CSRF-bescherming. - Sla gevoelige gegevens veilig op, bijvoorbeeld via environment variables. - Gebruik sterke, unieke client secrets. 2. OAuth2 externe providers integreren (Google, Facebook) a. Registratie bij providers: - Maak OAuth2 applicaties aan bij Google en Facebook via hun Developer Console. - Noteer client ID en secret. b. Laravel Socialite gebruiken: - Installeer Socialite: ```bash composer require laravel/socialite ``` - Configureer providers in `config/services.php`: ```php 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], 'facebook' => [ 'client_id' => env('FACEBOOK_CLIENT_ID'), 'client_secret' => env('FACEBOOK_CLIENT_SECRET'), 'redirect' => env('FACEBOOK_REDIRECT_URI'), ], ``` - Voeg in `.env` je credentials toe. c. Authenticatie routes en controllers: - Maak routes voor OAuth callback en redirect: ```php Route::get('/auth/redirect/{provider}', [AuthController::class, 'redirect'])->name('auth.redirect'); Route::get('/auth/callback/{provider}', [AuthController::class, 'callback'])->name('auth.callback'); ``` - In `AuthController`: ```php use Laravel\Socialite\Facades\Socialite; public function redirect($provider) { return Socialite::driver($provider)->redirect(); } public function callback($provider) { $socialUser = Socialite::driver($provider)->user(); // Zoek of maak gebruiker aan $user = User::firstOrCreate( ['email' => $socialUser->getEmail()], [ 'name' => $socialUser->getName(), // andere velden ] ); // Log de gebruiker in auth()->login($user); // Redirect naar dashboard return redirect()->intended('/dashboard'); } ``` 3. Gebruikersrollen en permissies a. Rollen en permissies modelleren: - Gebruik een package zoals Spatie Laravel Permission: ```bash composer require spatie/laravel-permission ``` - Publiceer de configuratie en migraties: ```bash php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" php artisan migrate ``` - In je User model: ```php use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasRoles; } ``` b. Rollen aanmaken: - Beheerder (volledige toegang) - Gebruiker (alleen lezen) c. Toewijzen: ```php use Spatie\Permission\Models\Role; $roleAdmin = Role::create(['name' => 'beheerder']); $roleUser = Role::create(['name' => 'gebruiker']); $user->assignRole('beheerder'); ``` d. Permissies instellen: - Bijvoorbeeld: ```php use Spatie\Permission\Models\Permission; Permission::create(['name' => 'read']); Permission::create(['name' => 'write']); $roleAdmin->givePermissionTo('read', 'write'); $roleUser->givePermissionTo('read'); ``` 4. Veiligheidsmaatregelen en best practices - Gebruik HTTPS voor alle dataverkeer. - Implementeer OAuth2 tokens met korte levensduur en refresh tokens. - Controleer en valideer alle OAuth2 responses. - Gebruik prepared statements en ORM om SQL-injectie te voorkomen. - Beperk toegangsrechten op basis van rollen en permissies. - Log alle authenticatie en autorisatie-activiteiten. - Implementeer two-factor authenticatie voor beheerders. - Voer regelmatige security audits uit en houd dependencies up-to-date. 5. Teststrategie - Unit tests voor authenticatie- en autorisatiefuncties. - Integratietests met mock OAuth2 responses. - End-to-end tests met tools zoals Laravel Dusk. - Test verschillende scenario’s: - Sociale login met geldige en ongeldige gegevens. - Rollen en permissies werking. - Token verval en refresh. - Beveiliging van endpoints. Door deze aanpak te volgen, bouw je een veilig, flexibel en schaalbaar authenticatiesysteem in Laravel dat OAuth2 en sociale login ondersteunt met duidelijke gebruikersrollen en permissies.
provider: deepseek
model: deepseek-chat
Zeker, ik help je graag een geavanceerd authenticatiesysteem te bouwen in Laravel. Hier is een complete implementatiegids: ## 1. Vereisten Installatie Installeer eerst de benodigde packages: ```bash composer require laravel/socialite composer require league/oauth2-google composer require league/oauth2-facebook ``` ## 2. OAuth2 Providers Configuratie **config/services.php:** ```php 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], 'facebook' => [ 'client_id' => env('FACEBOOK_CLIENT_ID'), 'client_secret' => env('FACEBOOK_CLIENT_SECRET'), 'redirect' => env('FACEBOOK_REDIRECT_URI'), ], ``` ## 3. Database Migraties **Create roles and permissions tables:** ```bash php artisan make:migration create_roles_and_permissions_tables ``` **Migration file:** ```php public function up() { Schema::create('roles', function (Blueprint $table) { $table->id(); $table->string('name')->unique(); $table->timestamps(); }); Schema::create('permissions', function (Blueprint $table) { $table->id(); $table->string('name')->unique(); $table->timestamps(); }); Schema::create('role_permission', function (Blueprint $table) { $table->foreignId('role_id')->constrained(); $table->foreignId('permission_id')->constrained(); $table->primary(['role_id', 'permission_id']); }); Schema::create('user_role', function (Blueprint $table) { $table->foreignId('user_id')->constrained(); $table->foreignId('role_id')->constrained(); $table->primary(['user_id', 'role_id']); }); } ``` ## 4. Models en Relationships **User.php:** ```php use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; public function roles() { return $this->belongsToMany(Role::class); } public function hasRole($role) { return $this->roles()->where('name', $role)->exists(); } public function hasPermission($permission) { return $this->roles()->whereHas('permissions', function ($query) use ($permission) { $query->where('name', $permission); })->exists(); } } ``` **Role.php:** ```php class Role extends Model { public function users() { return $this->belongsToMany(User::class); } public function permissions() { return $this->belongsToMany(Permission::class); } } ``` ## 5. OAuth Controllers **SocialAuthController.php:** ```php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Laravel\Socialite\Facades\Socialite; use App\Models\User; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; class SocialAuthController extends Controller { public function redirectToProvider($provider) { return Socialite::driver($provider)->redirect(); } public function handleProviderCallback($provider) { try { $socialUser = Socialite::driver($provider)->user(); $user = User::where('email', $socialUser->getEmail())->first(); if (!$user) { $user = User::create([ 'name' => $socialUser->getName(), 'email' => $socialUser->getEmail(), 'password' => Hash::make(uniqid()), 'provider' => $provider, 'provider_id' => $socialUser->getId(), ]); // Standaard rol toewijzen $userRole = Role::where('name', 'gebruiker')->first(); $user->roles()->attach($userRole); } Auth::login($user); return redirect()->intended('/dashboard'); } catch (\Exception $e) { return redirect('/login')->withErrors([ 'message' => 'Authenticatie mislukt: ' . $e->getMessage() ]); } } } ``` ## 6. Middleware voor Permissies **Create PermissionMiddleware:** ```bash php artisan make:middleware CheckPermission ``` **CheckPermission.php:** ```php public function handle($request, Closure $next, $permission) { if (!Auth::check() || !Auth::user()->hasPermission($permission)) { abort(403, 'Toegang geweigerd'); } return $next($request); } ``` ## 7. Routes **web.php:** ```php // Socialite routes Route::get('/auth/{provider}', [SocialAuthController::class, 'redirectToProvider']); Route::get('/auth/{provider}/callback', [SocialAuthController::class, 'handleProviderCallback']); // Protected routes Route::middleware(['auth', 'permission:read'])->group(function () { Route::get('/dashboard', 'DashboardController@index'); }); Route::middleware(['auth', 'permission:admin'])->group(function () { Route::get('/admin', 'AdminController@index'); Route::resource('/users', 'UserController'); }); ``` ## 8. Beveiligingsmaatregelen **.env configuratie:** ```env SESSION_DRIVER=redis SESSION_SECURE_COOKIE=true SESSION_HTTP_ONLY=true GOOGLE_CLIENT_ID=your_google_id GOOGLE_CLIENT_SECRET=your_google_secret GOOGLE_REDIRECT_URI=https://yourdomain.com/auth/google/callback FACEBOOK_CLIENT_ID=your_facebook_id FACEBOOK_CLIENT_SECRET=your_facebook_secret FACEBOOK_REDIRECT_URI=https://yourdomain.com/auth/facebook/callback ``` **App\Http\Kernel.php:** ```php protected $middleware = [ \App\Http\Middleware\TrustProxies::class, \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ]; ``` ## 9. Teststrategie **Unit Tests:** ```bash php artisan make:test AuthenticationTest ``` **AuthenticationTest.php:** ```php public function test_google_oauth_redirect() { $response = $this->get('/auth/google'); $response->assertRedirect(); } public function test_admin_permission_access() { $admin = User::factory()->create(); $adminRole = Role::create(['name' => 'beheerder']); $admin->roles()->attach($adminRole); $this->actingAs($admin) ->get('/admin') ->assertStatus(200); } public function test_user_permission_denied() { $user = User::factory()->create(); $userRole = Role::create(['name' => 'gebruiker']); $user->roles()->attach($userRole); $this->actingAs($user) ->get('/admin') ->assertStatus(403); } ``` ## 10. Uitvoeren van Tests ```bash # Database seeden voor tests php artisan db:seed --class=RolesAndPermissionsSeeder # Tests uitvoeren php artisan test tests/Feature/AuthenticationTest.php # Security scan composer require nunomaduro/phpinsights --dev ./vendor/bin/phpinsights ``` ## 11. Aanvullende Beveiliging - Implementeer **Rate Limiting** voor login pogingen - Gebruik **HTTPS** voor alle communicatie - Implementeer **CSRF protection** - Gebruik **Secure cookies** - **Logging** van alle authenticatiepogingen - **Two-Factor Authentication** optioneel toevoegen Dit authenticatiesysteem biedt een robuuste basis met OAuth2 integratie, rolgebaseerde toegang en uitgebreide beveiligingsmaatregelen. Zorg ervoor dat je de environment variables correct configureert en de OAuth credentials bij de respectievelijke providers registreert.
error: Generation failed [deepseek] prompt_id=1553 locale=en err=DeepSeek connection/timeout