{"id":51533,"date":"2023-03-30T15:42:15","date_gmt":"2023-03-30T13:42:15","guid":{"rendered":"https:\/\/kinsta.com\/nl\/?p=51533&#038;preview=true&#038;preview_id=51533"},"modified":"2025-09-01T17:52:08","modified_gmt":"2025-09-01T15:52:08","slug":"laravel-authenticatie","status":"publish","type":"post","link":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/","title":{"rendered":"Een uitgebreide handleiding voor Laravel authenticatie"},"content":{"rendered":"<p>Authenticatie is een van de meest kritische en essenti\u00eble features van webapplicaties. Webframeworks als Laravel bieden vele manieren om gebruikers te authenticeren.<\/p>\n<p>Je kunt Laravel authenticatiefeatures vaak snel en veilig implementeren. Het slecht implementeren van deze authenticatiefuncties kan echter riskant zijn, omdat kwaadwillenden er misbruik van kunnen maken.<\/p>\n<p>Deze handleiding leert je alles wat je moet weten om aan de slag te gaan met de door jou gekozen Laravel authenticatiemethoden.<\/p>\n<p>Lees verder!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Een inleiding tot Laravel authenticatie<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-laravel\/\">Laravel<\/a> bevat modules die bestaan uit &#8220;guards&#8221; en &#8220;<a href=\"https:\/\/laravel.com\/docs\/9.x\/providers\">providers<\/a>&#8220;. Guards defini\u00ebren de authenticatie van gebruikers voor elk verzoek, en providers defini\u00ebren het ophalen van gebruikers uit <a href=\"https:\/\/kinsta.com\/nl\/blog\/persistent-storage\/\">persistente opslag<\/a> (b.v. <a href=\"https:\/\/kinsta.com\/nl\/blog\/wat-is-mysql\/\">MySQL<\/a> database).<\/p>\n<p>We defini\u00ebren onze authenticatieparameters in een bestand met de naam <code>config\/auth.php<\/code>. Het bevat verschillende opties om het authenticatiegedrag van Laravel aan te passen.<\/p>\n<p>Eerst moet je de standaardinstellingen van authenticatie defini\u00ebren. Deze optie regelt de standaard authenticatie &#8220;guard&#8221; en resetopties van het wachtwoord van je applicatie. Je kunt deze standaardinstellingen naar behoefte wijzigen, maar ze vormen een perfecte start voor de meeste applicaties.<\/p>\n<p>Vervolgens definieer je de authenticatiemonitoring voor je applicatie. Hier gebruikt onze standaardconfiguratie sessieopslag en de Eloquent userprovider. Alle authenticatiestuurprogramma&#8217;s hebben een userprovider.<\/p>\n<pre><code class=\"language-php\">&lt;?php\nreturn [\n    \/* \n    Defining Authentication Defaults  \n    *\/\n    \n    'defaults' =&gt; [\n        'guard' =&gt; 'web', \n        'passwords' =&gt; 'users',\n    ],\n    \n    \/*\n    Defining Authentication Guards\n   \n    Supported: \"session\"\n    *\/\n\n    'guards' =&gt; [\n        'web' =&gt; [\n            'driver' =&gt; 'session',\n            'provider' =&gt; 'users',\n        ],\n     ],\n    \n    \/*\n    Defining User Providers\n\n    Supported: \"database\", \"eloquent\"\n    *\/\n\n    'providers' =&gt; [\n        'users' =&gt; [\n             'driver' =&gt; 'eloquent',\n             'model' =&gt; AppModelsUser::class,\n        ], \n\n        \/\/ 'users' =&gt; [\n        \/\/     'driver' =&gt; 'database',\n        \/\/     'table' =&gt; 'users',\n        \/\/ ],\n    ],\n\n    \/*\n    Defining Password Resetting\n    *\/\n\n    'passwords' =&gt; [\n        'users' =&gt; [\n            'provider' =&gt; 'users',\n            'table' =&gt; 'password_resets',\n            'expire' =&gt; 60,\n            'throttle' =&gt; 60,\n         ],\n     ],\n\n     \/*\n     Defining Password Confirmation Timeout\n     *\/\n\n    'password_timeout' =&gt; 10800,\n];<\/code><\/pre>\n<p>Later zorgen we ervoor dat alle authenticatiestuurprogramma&#8217;s een userprovider hebben. Deze definieert hoe de gebruikers worden opgehaald uit je database of andere opslagmechanismen om de gegevens van je gebruikers te persisteren. Je kunt meerdere bronnen configureren die elk model of tabel vertegenwoordigen, als je meerdere gebruikerstabellen of -modellen hebt. Deze bronnen kunnen worden toegewezen aan alle extra authenticatieguards die je hebt gedefinieerd.<\/p>\n<p>Gebruikers kunnen ook hun wachtwoorden opnieuw willen instellen. Hiervoor kun je meerdere wachtwoordresetconfiguraties opgeven als je meer dan \u00e9\u00e9n gebruikerstabel of -model in de applicatie hebt en aparte instellingen wilt op basis van de specifieke gebruikerstypes. De vervaltijd is het aantal minuten dat elk resettoken geldig is. Deze beveiligingsfeature houdt de tokens kort geldig, zodat ze minder tijd hebben om geraden te worden. Je kunt dit naar behoefte veranderen.<\/p>\n<p>Uiteindelijk moet je de tijd bepalen voordat een wachtwoordbevestiging uitvalt, en de gebruiker gevraagd wordt zijn wachtwoord opnieuw in te voeren via het bevestigingsscherm. Standaard duurt de timeout drie uur.<\/p>\n<h2>Soorten Laravel authenticatiemethoden<\/h2>\n<p>Er is geen perfecte manier die werkt bij elk type scenario waarin je wilt authenticeren, maar als je ze kent kun je betere beslissingen nemen. Het is daarnaast ook belangrijk te weten hoe Laravel zich heeft ontwikkeld wat betreft nieuwe features in <a href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-9\/\">Laravel 9<\/a>. Dit maakt ons werk als developers veel gemakkelijker bij het wisselen en kiezen van authenticatiemethoden.<\/p>\n<h3>Authenticatie met wachtwoord<\/h3>\n<p>Als simpele manier om een gebruiker te authenticeren, wordt het nog steeds gebruikt door duizenden organisaties, maar gezien de huidige ontwikkeling is het duidelijk verouderd aan het raken.<\/p>\n<p>Providers moeten complexe wachtwoordimplementaties afdwingen en tegelijkertijd zorgen voor minimale wrijving voor de eindgebruiker.<\/p>\n<p>Het werkt vrij eenvoudig, de gebruiker voert de naam en het wachtwoord in, en als er in de database een overeenkomst is tussen die twee, besluit de server het verzoek te authenticeren en de gebruiker toegang te geven tot de resources voor een vooraf bepaalde tijd.<\/p>\n<h3>Authenticatie met een token<\/h3>\n<p>Bij deze methode krijgt de gebruiker na verificatie een uniek token.<\/p>\n<p>Met dit token heeft de gebruiker toegang tot de relevante resources. Het privilege is actief totdat het token verloopt.<\/p>\n<p>Zolang het token actief is, hoeft de gebruiker geen gebruikersnaam of wachtwoord te gebruiken, maar bij het ophalen van een nieuw token zijn die twee wel nodig.<\/p>\n<p>Tokens worden tegenwoordig veel gebruikt in allerlei scenario&#8217;s, omdat het stateless entiteiten zijn die alle authenticatiegegevens bevatten.<\/p>\n<p>Het bieden van een manier om tokengeneratie en tokenverificatie te scheiden geeft vendors veel flexibiliteit.<\/p>\n<h3>Multi-factor authenticatie<\/h3>\n<p>Zoals de naam al aangeeft, houdt dit in dat er minstens twee authenticatiefactoren worden gebruikt, waardoor de beveiliging wordt verhoogd.<\/p>\n<p>In tegenstelling tot <a href=\"https:\/\/kinsta.com\/nl\/blog\/wordpress-2fa\/\">authenticatie met twee factoren<\/a>, waarbij slechts twee factoren worden gebruikt, kan deze methode twee, drie, vier, en meer..<\/p>\n<p>Bij deze methode wordt meestal een wachtwoord gebruikt, waarna de gebruiker een verificatiecode op zijn smartphone ontvangt. Leveranciers die deze methode implementeren moeten uitkijken voor valse positieven en netwerkuitval, die grote problemen kunnen worden bij snelle opschaling.<\/p>\n<h2>Zo implementeer je Laravel authenticatie<\/h2>\n<p>In dit gedeelte leer je meerdere manieren om de gebruikers van je applicatie te authenticeren. Sommige bibliotheken zoals Jetstream, Breeze en Socialite hebben <a href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-tutorial\/\">gratis tutorials<\/a> over hoe ze te gebruiken.<\/p>\n<h3>Handmatige authenticatie<\/h3>\n<p>Te beginnen met het registreren van gebruikers en het maken van de benodigde routes in <code>routes\/web.php<\/code><strong>.<\/strong><\/p>\n<p>We zullen twee routes maken, \u00e9\u00e9n om het formulier te bekijken en \u00e9\u00e9n om te registreren:<\/p>\n<pre><code class=\"language-php\"> use App\\Http\\Controllers\\Auth\\RegisterController;\nuse Illuminate\\Support\\Facades\\Route;\n\n\/*\nWeb Routes \n\nRegister web routes for your app's RouteServiceProvider \nin a group containing the \"web\" middleware\n*\/\n\nRoute::get('\/register', [RegisterController::class, 'create']);\n\nRoute::post('\/register', [RegisterController::class, 'store']);<\/code><\/pre>\n<p>En de controller maken die daarvoor nodig is:<\/p>\n<pre><code class=\"language-bash\">php artisan make controller Auth\/RegisterController -r<\/code><\/pre>\n<p>Werk nu de code als volgt bij:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse illuminateHtppRequest;\n\nclass RegisterController extends Controller\n{\n    public function create()\n    {\n        return view('auth.register');\n    }\n\n    public function store(Request $request)\n    {\n    }\n}<\/code><\/pre>\n<p>De controller is nu leeg en geeft een view terug om te registreren. Laten we die view maken in <code>resources\/views\/auth<\/code> en het <code>register.blade.php<\/code> noemen .<\/p>\n<figure style=\"width: 1968px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Laravel-Register-User.png\" alt=\"Laravel blade view voor het registreren van gebruikers.\" width=\"1968\" height=\"1862\"><figcaption class=\"wp-caption-text\">Laravel blade view voor het registreren van gebruikers.<\/figcaption><\/figure>\n<p>Nu met alles op zijn plaats, zouden we onze <code>\/register<\/code> route moeten bezoeken en het volgende formulier moeten zien:<\/p>\n<figure id=\"attachment_162747\" aria-describedby=\"caption-attachment-162747\" style=\"width: 960px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-162747\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/laravel-authentication-user-login-form.png\" alt=\"Registratieformulier voor handmatige verificatie.\" width=\"960\" height=\"264\"><figcaption id=\"caption-attachment-162747\" class=\"wp-caption-text\">Registratieformulier voor handmatige verificatie.<\/figcaption><\/figure>\n<p>Nu we een formulier kunnen weergeven dat een gebruiker kan invullen en de gegevens ervoor kunnen krijgen, moeten we de gegevens van de gebruikers ophalen, valideren, en dan in de database opslaan als alles in orde is. Hier moet je een databasetransactie gebruiken om er zeker van te zijn dat de gegevens die je invoegt compleet zijn.<\/p>\n<p>We zullen de verzoekvalidatiefeature van Laravel gebruiken om ervoor te zorgen dat alle drie de inloggegevens vereist zijn. We moeten ervoor zorgen dat de e-mail een e-mailformat heeft en uniek is in de tabel <code>users<\/code> en dat het wachtwoord bevestigd is en minimaal acht tekens telt:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateFoundationAuthUser;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesHash;\n\nclass RegisterController extends Controller\n{\n    public function store(Request $request)\n    {\n        \/* \n        Validation\n        *\/\n        $request-&gt;validate([\n            'name' =&gt; 'required',\n            'email' =&gt; 'required|email|unique:users',\n            'password' =&gt; 'required|confirmed|min:8',\n        ]);\n\n        \/*\n        Database Insert\n        *\/\n         $user = User::create([\n            'name' =&gt; $request-&gt;name,\n            'email' =&gt; $request-&gt;email,\n            'password' =&gt; Hash::make($request-&gt;password),\n        ]);\n\n        return back();\n    }\n\n    public function create()\n    {\n        return view('auth.register');\n    }\n}<\/code><\/pre>\n<p>Nu onze invoer gevalideerd is, zal alles wat tegen onze validatie ingaat een fout opleveren die in het formulier wordt weergegeven:<\/p>\n<figure id=\"attachment_162751\" aria-describedby=\"caption-attachment-162751\" style=\"width: 960px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-162751\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/03\/laravel-authentication-invalid-register-input.png\" alt=\"Voorbeeld van ongeldige invoer voor registratie.\" width=\"960\" height=\"168\"><figcaption id=\"caption-attachment-162751\" class=\"wp-caption-text\">Voorbeeld van ongeldige invoer voor registratie.<\/figcaption><\/figure>\n<p>Ervan uitgaande dat we een gebruikersaccount hebben aangemaakt in de methode <code>store<\/code>, willen we de gebruiker ook aanmelden. Er zijn twee manieren waarop we dat kunnen doen. We kunnen het handmatig doen of <strong>Auth facade<\/strong> gebruiken.<\/p>\n<p>Nadat de gebruiker is ingelogd, moeten we hem niet terugbrengen naar het Register scherm, maar naar een nieuwe pagina, zoals een dashboard of homepage. Dat is wat we hier gaan doen:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse AppProvidersRouteServiceProvider;\nuse IlluminateFoundationAuthUser;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesAuth;\nuse IlluminateSupportFacadesHash;\n\nclass RegisterController extends Controller\n{\n    public function store(Request $request)\n    {\n        \/* \n        Validation\n        *\/\n        $request-&gt;validate([\n            'name' =&gt; 'required',\n            'email' =&gt; 'required|email|unique:users',\n            'password' =&gt; 'required|confirmed|min:8',\n        ]);\n\n        \/*\n        Database Insert\n        *\/\n        $user = User::create([\n            'name' =&gt; $request-&gt;name,\n            'email' =&gt; $request-&gt;email,\n            'password' =&gt; Hash::make($request-&gt;password),\n        ]);\n\n        Auth::login($user);\n\n        return redirect(RouteServiceProvider::HOME);\n    }\n\n    public function create()\n    {\n        return view('auth.register');\n    }\n}<\/code><\/pre>\n<p>En nu we een gebruiker hebben geregistreerd en ingelogd <code>-n<\/code>, moeten we ervoor zorgen dat hij veilig kan uitloggen.<\/p>\n<p>Laravel stelt voor dat we de sessie ongeldig maken en het token voor de veiligheid regenereren na een afmelding. En dit is precies wat we gaan doen. We beginnen met het maken van een nieuwe <code>\/logout<\/code> route met behulp van de methode<code>destroy<\/code> van de <strong>LogoutController <\/strong>:<\/p>\n<pre><code class=\"language-php\">use AppHttpControllersAuthRegisterController;\nuse AppHttpControllersAuthLogoutController;\nuse IlluminateSupportFacadesRoute;\n\n\/*\nWeb Routes\n\nHere is where you can register web routes for your application. These\nroutes are loaded by the RrouteServiceProvider with a group which\ncontains the \"web\" middleware group. Now create something great!\n*\/\n\nRoute::get('\/register', [RegisterController::class, 'create']);\n\nRoute::post('\/register', [RegisterController::class, 'store']);\n\nRoute::post('\/logout', [Logoutcontroller::class, 'destroy'])\n    -&gt;middleware('auth');<\/code><\/pre>\n<p>Het doorgeven van het uitloggen via de <code>auth<\/code> middleware is erg belangrijk. De gebruikers moeten geen toegang krijgen tot de route als ze niet ingelogd zijn.<\/p>\n<p>Maak nu een controller zoals we eerder deden:<\/p>\n<pre><code class=\"language-bash\">php artisan make:controller Auth\/LogoutController -r<\/code><\/pre>\n<p>We kunnen ervoor zorgen dat we het verzoek als parameter krijgen in de methode <code>destroy<\/code>. We loggen de gebruiker uit via de Auth facade, maken de sessie ongeldig en regenereren het token, en sturen de gebruiker dan door naar de homepage:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesAuth;\n\nclass LogoutController extends Controller\n{\n    public function destroy(Request $request)\n    { \n        Auth::logout();\n\n        $request-&gt;session()-&gt;invalidate();\n\n        $request-&gt;session()-&gt;regenerateToken();\n \n        return redirect('\/');\n     }\n}<\/code><\/pre>\n<h3>Gebruikers onthouden<\/h3>\n<p>De meeste, zo niet alle, moderne webapplicaties bieden een &#8220;remember me&#8221; checkbox op hun aanmeldingsformulier.<\/p>\n<p>Als we een &#8220;remember me&#8221; functionaliteit willen bieden, kunnen we een booleaanse waarde doorgeven als tweede argument aan de attempt methode.<\/p>\n<p>Bij geldigheid zal Laravel de gebruiker voor onbepaalde tijd geauthenticeerd houden, of totdat hij handmatig wordt uitgelogd. De gebruikerstabel moet de kolom string <code>remember_token<\/code> (daarom regenereren we de tokens) bevatten, waarin we ons &#8220;remember me&#8221; token opslaan.<\/p>\n<p>De standaardmigratie voor gebruikers bevat die al.<\/p>\n<p>Om te beginnen moet je het <strong>Remember Me<\/strong> veld toevoegen aan je formulier:<\/p>\n<figure style=\"width: 1396px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/RememberMe.png\" alt=\"Remember me veldformulier\" width=\"1396\" height=\"596\"><figcaption class=\"wp-caption-text\">Remember me veldformulier<\/figcaption><\/figure>\n<p>En daarna haal je de credentials uit het verzoek en gebruik je ze op de attempt methode op de Auth facade.<\/p>\n<p>Als de gebruiker onthouden moet worden, loggen we hem in en sturen hem door naar onze homepage. Anders geven we een foutmelding:<\/p>\n<pre><code class=\"language-php\">public function store(Request $request)\n{\n    $credentials = $request-&gt;only('email', 'password');\n\n    if (Auth::attempt($credentials, $request-&gt;filled('remember'))) {\n        $request-&gt;session()-&gt;regenerate();\n \n        return redirect()-&gt;intended('\/');\n    }\n\n    return back()-&gt;withErrors([\n    return back()-&gt;withErrors([\n 'email' =&gt; 'The provided credentials do not match our records.',\n ]);\n}<\/code><\/pre>\n<h3>Wachtwoorden resetten<\/h3>\n<p>De meeste webapplicaties bieden tegenwoordig manieren voor gebruikers om hun wachtwoord opnieuw in te stellen.<\/p>\n<p>We zullen nog een route maken voor het vergeten wachtwoord en de controller maken zoals we deden. Daarnaast zullen we een route toevoegen voor de link om het wachtwoord te resetten, die het token voor het hele proces bevat:<\/p>\n<pre><code class=\"language-php\">Route::post('\/forgot-password', [ForgotPasswordLinkController::class, 'store']);\n\nRoute::post('\/forgot-password\/{token}', [ForgotPasswordController::class, 'reset']);<\/code><\/pre>\n<p>Binnen de store methode nemen we de e-mail uit het verzoek en valideren die zoals we deden.<\/p>\n<p>Hierna kunnen we de methode <code>sendResetLink<\/code> uit de wachtwoordfacade gebruiken.<\/p>\n<p>En dan willen we als antwoord de status teruggeven als het gelukt is om de link te versturen, of anders fouten:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesPassword;\n\nclass ForgotPasswordLinkController extends Controller\n{\n    public function store(Request $request)\n    {\n        $request-&gt;validate([\n             'email' =&gt; 'required|email',\n        ]);\n\n        $status = Password::sendResetLink(\n            $request-&gt;only('email');\n        );\n\n        return $status === Password::RESET_LINK_SENT\n            ? back()-&gt;with('status', __($status))\n            : back()-&gt;withInput($request-&gt;only('email'))-&gt;withErrors(['email' =&gt; __($status)]);\n     }\n}<\/code><\/pre>\n<p>Nu de resetlink naar de e-mail van de gebruiker is gestuurd, moeten we zorgen voor de logica van wat er daarna gebeurt.<\/p>\n<p>We krijgen het token, de e-mail en het nieuwe wachtwoord in het verzoek en valideren die.<\/p>\n<p>Hierna kunnen we de reset methode van de wachtwoordfacade gebruiken om Laravel de rest achter de schermen te laten regelen.<\/p>\n<p>We gaan het wachtwoord altijd hashen om het veilig te houden.<\/p>\n<p>Aan het eind controleren we of het wachtwoord gereset is, en als dat zo is, sturen we de gebruiker door naar het inlogscherm met een succesmelding. Anders geven we een foutmelding dat het niet gereset kon worden:<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllersAuth;\n\nuse AppHttpControllersController;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesHash;\nuse IlluminateSupportFacadesPassword;\nuse IlluminateSupportStr;\n\nclass ForgotPasswordController extends Controller\n{\n    public function reset(Request $request)\n    {\n        $request-&gt;validate([\n            'token' =&gt; 'required',\n            'email' =&gt; 'required|email',\n            'password' =&gt; 'required|string|confirmed|min:8',\n        ]);\n\n        $status = Password::reset(\n            $request-&gt;only('email', 'password', 'password_confirmation', 'token'),\n            function ($user) use ($request) {\n                $user-&gt;forceFill(\n                    'password' =&gt; Hash::make($request-&gt;password),\n                    'remember_token' =&gt; Str::random(60)\n                ])-&gt;save();\n            }\n        );\n\n        return $status == Password::PASSWORD_RESET\n            ? redirect()-&gt;route('login')-&gt;with('status', __($status))\n            : back()-&gt;withInput($request-&gt;only('email'))-&gt;withErrors(['email' =&gt; __($status)]);\n    }\n}<\/code><\/pre>\n<h2>Laravel Breeze<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-breeze\/\">Laravel Breeze<\/a> is een eenvoudige implementatie van Laravel authenticatiefeatures: inloggen, registratie, wachtwoordreset, e-mailverificatie en wachtwoordbevestiging. Je kunt het gebruiken om authenticatie te implementeren in je nieuwe Laravel applicatie.<\/p>\n<h3>Installatie en setup<\/h3>\n<p>Na het maken van je Laravel applicatie hoef je alleen nog maar je database te configureren, je migraties uit te voeren, en het laravel\/breeze pakket te installeren via composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/breeze --dev<\/code><\/pre>\n<p>Voer hierna het volgende uit:<\/p>\n<pre><code class=\"language-bash\">php artisan breeze:install<\/code><\/pre>\n<p>Dit zal je authenticatie views, routes, controllers en andere resources die het gebruikt publiceren. Na deze stap heb je volledige controle over alles wat Breeze biedt.<\/p>\n<p>Nu moeten we onze applicatie renderen naar de frontend, dus installeren we onze JS dependencies (die @vite zullen gebruiken):<\/p>\n<pre><code class=\"language-php\">npm install<\/code><\/pre>\n<p>:<\/p>\n<pre><code class=\"language-php\">npm run dev<\/code><\/pre>\n<p>Hierna zouden inlog- en registratielinks op je homepage moeten staan, en zou alles soepel moeten werken.<\/p>\n<h2>Laravel Jetstream<\/h2>\n<p>Laravel Jetstream breidt Laravel Breeze uit met handige features en andere frontend stacks.<\/p>\n<p>Het geeft je aanmelding, registratie, e-mailverificatie, <a href=\"https:\/\/www.google.com\/url?q=https:\/\/kinsta.com\/blog\/wordpress-two-factor-authentication\/&#038;sa=D&#038;source=editors&#038;ust=1665232246657389&#038;usg=AOvVaw0_jXtwBiKx5qxPlTHGGCXc\">twee-factor authenticatie<\/a>, sessiebeheer, API ondersteuning via Sanctum, en optioneel teambeheer.<\/p>\n<p>Je moet bij de installatie van Jetstream kiezen tussen Livewire en <a href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-inertia\/\">Inertia<\/a> aan de frontend. Aan de backend gebruikt het Laravel Fortify, een frontend agnostische, &#8220;headless&#8221; authenticatie backend voor Laravel.<\/p>\n<h3>Installatie en setup<\/h3>\n<p>We installeren het via composer in ons Laravel Project:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/jetstream<\/code><\/pre>\n<p>Hierna voeren we het commando <code>php artisan jetstream:install [stack]<\/code> uit, dat <code>[stack]<\/code> argumenten <code>Livewire<\/code> of <code>Inertia<\/code> accepteert. Je kunt de optie <code>--teams<\/code>\u00a0doorgeven om de teams feature in te schakelen.<\/p>\n<p>Dit zal ook Pest <a href=\"https:\/\/www.google.com\/url?q=https:\/\/kinsta.com\/blog\/scripting-languages\/&#038;sa=D&#038;source=editors&#038;ust=1665232246659068&#038;usg=AOvVaw0OuP24kCNOrcZIHp8-2y_A\">PHP<\/a> installeren om te testen.<\/p>\n<p>En tenslotte moeten we de frontend van onze applicatie renderen met het volgende:<\/p>\n<pre><code class=\"language-php\">npm install\nnpm run dev<\/code><\/pre>\n<h2>Laravel Fortify<\/h2>\n<p>Laravel Fortify is een backend authenticatie-implementatie die frontend agnostisch is. Je hoeft Laravel Fortify niet te gebruiken om de authenticatiefeatures van Laravel te implementeren.<\/p>\n<p>Het wordt ook gebruikt in starterkits als Breeze en Jetstream. Je kunt Fortify ook standalone gebruiken, wat slechts een backend implementatie is. Als je het standalone gebruikt, moet je frontend de Fortify routes callen.<\/p>\n<h3>Installatie en setup<\/h3>\n<p>We kunnen Fortify installeren via composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/fortify<\/code><\/pre>\n<p>Nu moeten we de resources van Fortify publiceren:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish --provider=\"LaravelFortifyFortifyServiceProvider\"<\/code><\/pre>\n<p>Hierna maken we een nieuwe <strong>app\/Actions<\/strong> map aan, naast de nieuwe <strong>FortifyServiceProvider<\/strong>, het configuratiebestand en de databasemigraties.<\/p>\n<p>Voer tot slot uit:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate<\/code><\/pre>\n<p>Of:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh<\/code><\/pre>\n<p>En je Fortify is klaar voor gebruik.<\/p>\n<h2>Laravel Socialite<\/h2>\n<p>Laravel bevat een eenvoudige, op OAuth gebaseerde gebruikersauthenticatiefeature. Deze ondersteunt sociale logins via Facebook, <a href=\"https:\/\/kinsta.com\/nl\/blog\/twitter-statistieken\/\">Twitter<\/a>, <a href=\"https:\/\/kinsta.com\/blog\/linkedin-statistics\/\">LinkedIn<\/a>, Google, <a href=\"https:\/\/kinsta.com\/nl\/blog\/git-voor-webdevelopment\/\">Bitbucket, GitHub en GitLab<\/a>.<\/p>\n<h3>Installatie<\/h3>\n<p>We kunnen het installeren via composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/socialite<\/code><\/pre>\n<h3>Installatie en gebruik<\/h3>\n<p>Nadat we het ge\u00efnstalleerd hebben, moeten we de referenties toevoegen voor de OAuth provider die onze applicatie gebruikt. We voegen ze toe in <strong>config\/services.php<\/strong> voor elke dienst.<\/p>\n<p>In de configuratie moeten we de sleutel afstemmen op de vorige diensten. Enkele van die sleutels zijn:<\/p>\n<ul>\n<li>facebook<\/li>\n<li>twitter (Voor OAuth 1.0)<\/li>\n<li>twitter-oauth-2 (Voor OAuth 2.0)<\/li>\n<li>linkedin<\/li>\n<li>google<\/li>\n<li>github<\/li>\n<li>gitlab<\/li>\n<li>bitbucket<\/li>\n<\/ul>\n<p>Een dienstconfiguratie kan er als volgt uitzien:<\/p>\n<pre><code class=\"language-php\">'google' =&gt; [\n    'client_id' =&gt; env(\"GOOGLE_CLIENT_ID\"),\n    'client_secret' =&gt; env(\"GOOGLE_CLIENT_SECRET\"),\n    'redirect' =&gt; \"http:\/\/example.com\/callback-url\",\n],<\/code><\/pre>\n<h3>Gebruikers authenticeren<\/h3>\n<p>Voor deze actie hebben we twee routes nodig, \u00e9\u00e9n om de gebruiker door te sturen naar de OAuth provider:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSociliate;\n\nRoute::get('\/auth\/redirect', function () {\n    return Socialite::driver('google')-&gt;redirect();\n});<\/code><\/pre>\n<p>En \u00e9\u00e9n voor de callback van de provider na authenticatie:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSocialite;\n\nRoute:;get('\/auht\/callback', function () {\n    $user = Socialite::driver('google')-&gt;user();\n\n    \/\/ Getting the user data\n    $user-&gt;token;\n});<\/code><\/pre>\n<p>Socialite levert de redirect methode, en de facade stuurt de gebruiker door naar de OAuth provider, terwijl de gebruikersmethode het inkomende verzoek onderzoekt en de gebruikersinformatie ophaalt.<\/p>\n<p>Nadat we onze gebruiker hebben ontvangen, moeten we controleren of hij bestaat in onze database en hem authenticeren. Als hij niet bestaat, maken we een nieuw record aan om de gebruiker te vertegenwoordigen:<\/p>\n<pre><code class=\"language-php\">use AppModelsUser;\nuse IlluminateSupportFacadesAuth;\nuse LaravelSocialiteFacadesSocialite;\n\nRoute::get('\/auth\/callback', function () {\n   \/*\n   Get the user\n   *\/\n   $googleUser = Socialite::driver('google')-&gt;user();\n   \n   \/*\n   Create the user if it does not exist\n   Update the user if it exists\n   \n   Check for google_id in database\n   *\/\n   $user = User::updateOrCreate([\n       'google_id' =&gt; $googleUser-&gt;id,\n   ], [\n       'name' =&gt; $googleUser-&gt;name,\n       'email' =&gt; $googleUser-&gt;email,\n       'google_token' =&gt; $googleUser-&gt;token,\n       'google_refresh_token' =&gt; $googleUser-&gt;refreshToken,\n   ]);\n\n   \/*\n   Authenticates the user using the Auth facade\n   *\/\n    Auth::login($user);\n   \n    return redirect('\/dashboard');\n});<\/code><\/pre>\n<p>Als we de toegangsscopes van de gebruiker willen beperken, kunnen we de methode <code>scopes<\/code> gebruiken, die we opnemen in het authenticatieverzoek. Dit zal alle eerder opgegeven scopes samenvoegen met de opgegeven scopes.<\/p>\n<p>Een alternatief hiervoor is het gebruik van de methode <code>setScopes<\/code>, die elke andere bestaande scoop overschrijft:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSocialite;\n\nreturn Socialite::driver('google')\n    -&gt;scopes(['read:user', 'write:user', 'public_repo'])\n    -&gt;redirect();\n\nreturn Socialite::driver('google')\n    -&gt;setScopes(['read:user', 'public_repo'])\n    -&gt;redirect();<\/code><\/pre>\n<p>Nu we alles weten en weten hoe we een gebruiker kunnen krijgen na de callback, laten we eens kijken naar enkele gegevens die we daaruit kunnen halen.<\/p>\n<p>OAuth1 Gebruiker heeft <code>token<\/code> en <code>tokenSecret<\/code>:<\/p>\n<pre><code class=\"language-php\">$user = Socialite::driver('google')-&gt;user();\n\n$token = $user-&gt;token;\n$tokenSecret = $user-&gt;tokenSecret;<\/code><\/pre>\n<p>OAuth2 biedt <code>token<\/code>, <code>refreshToken<\/code>, en <code>expiresIn<\/code>:<\/p>\n<pre><code class=\"language-php\">$user = Socialite::driver('google')-&gt;user();\n\n$token = $user-&gt;token;\n$refreshToken = $user-&gt;refreshToken;\n$expiresIn = $user-&gt;expiresIn;<\/code><\/pre>\n<p>Zowel OAuth1 als OAuth2 bieden <code>getId<\/code>, <code>getNickname<\/code>, <code>getName<\/code>, <code>getEmail<\/code>, en <code>getAvatar<\/code>:<\/p>\n<pre><code class=\"language-php\">$user = Socialite::driver('google')-&gt;user();\n\n$user-&gt;getId();\n$user-&gt;getNickName();\n$user-&gt;getName();\n$user-&gt;getEmail();\n$user-&gt;getAvatar();<\/code><\/pre>\n<p>En als we gebruikersgegevens uit een token (OAuth 2) of een token en secret (OAuth 1) willen halen, biedt Socialite hiervoor twee methoden: <code>userFromToken<\/code> en <code>userFromTokenAndSecret<\/code>:<\/p>\n<pre><code class=\"language-php\">use LaravelSocialiteFacadesSocialite;\n\n$user = Socialite::driver('google')-&gt;userFromToken($token);\n$user = Socialite::driver('twitter')-&gt;userFromTokenAndSecret($token, $secret);<\/code><\/pre>\n<h2>Laravel Sanctum<\/h2>\n<p>Laravel Sanctum is een licht authenticatiesysteem voor SPA&#8217;s (Single Page Applications) en mobiele apps. Het laat gebruikers meerdere API tokens genereren met specifieke scopes. Deze scopes specificeren toegestane acties door een token.<\/p>\n<h3>Gebruik<\/h3>\n<p>Sanctum kan worden gebruikt om API tokens aan de gebruiker te verstrekken zonder de fijne kneepjes van OAuth. Die tokens hebben meestal lange verlooptijden, zoals jaren, maar kunnen op elk moment door de gebruiker worden herroepen en geregenereerd.<\/p>\n<h3>Installatie en setup<\/h3>\n<p>We kunnen het installeren via composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/sanctum<\/code><\/pre>\n<p>En we moeten de configuratie- en migratiebestanden publiceren:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish --provider=\"LaravelSanctumSanctumServiceProvider\"<\/code><\/pre>\n<p>Nu we nieuwe migratiebestanden hebben gegenereerd, moeten we ze migreren:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh<\/code><\/pre>\n<h3>Zo geef je API tokens uit<\/h3>\n<p>Voor het uitgeven van tokens moet ons User model de <strong>LaravelSanctumHasApiTokens<\/strong> trait gebruiken:<\/p>\n<pre><code class=\"language-php\">use LaravelSanctumHasApiTokens;\n\nclass User extends Authenticable\n{\n    use HasApiTokens;\n}<\/code><\/pre>\n<p>Als we de gebruiker hebben, kunnen we een token uitgeven door de methode <code>createToken<\/code> aan te roepen, die een <strong>LaravelSanctumNewAccessToken<\/strong> instance teruggeeft.<\/p>\n<p>We kunnen de methode <code>plainTextToken<\/code> aanroepen op de instance <strong>NewAccessToken<\/strong> om de <strong>SHA-256<\/strong> platte tekstwaarde van het token te zien.<\/p>\n<h2>Tips en best practices voor Laravel authenticatie<\/h2>\n<h3>Sessies op andere apparaten ongeldig maken<\/h3>\n<p>Zoals we eerder hebben besproken is het ongeldig maken van de sessie cruciaal als de gebruiker uitlogt, maar dat zou ook beschikbaar moeten zijn als optie voor alle apparaten die eigendom zijn.<\/p>\n<p>Deze feature wordt meestal gebruikt als de gebruiker zijn wachtwoord wijzigt of bijwerkt, en we zijn sessie ongeldig willen maken vanaf elk ander apparaat.<\/p>\n<p>Met de Auth facade is dit eenvoudig te realiseren. Aangezien de route die we gebruiken de <code>auth<\/code> en <code>auth.session middleware<\/code> heeft, kunnen we de <code>logoutOtherDevices<\/code> statische methode van de fa\u00e7ade gebruiken:<\/p>\n<pre><code class=\"language-php\">Route::get('\/logout', [LogoutController::class, 'invoke'])\n    -&gt;middleware(['auth', 'auth.session']);\n\n<\/code><\/pre>\n<pre><code class=\"language-php\">use IlluminateSupportFacadesAuth;\n\nAuth::logoutOtherDevices($password);<\/code><\/pre>\n<h3>Configuratie met Auth::routes()<\/h3>\n<p>De routes methode van de Auth facade is slechts een helper om alle routes te genereren die nodig zijn voor de gebruikersauthenticatie.<\/p>\n<p>De routes zijn Login (Get, Post), Logout (Post), Register (Get, Post), en Password Reset\/Email (Get, Post).<\/p>\n<p>Wanneer je de methode op de facade aanroept, doet deze het volgende:<\/p>\n<pre><code class=\"language-php\">public static function routes(array $options = [])\n{\n    if (!static::$app-&gt;providerIsLoaded(UiServiceProvider::class)) {\n        throw new RuntimeException('In order to use the Auth:;routes() method, please install the laravel\/ui package.');\n    }\n   \n    static::$app-&gt;make('router')-&gt;auth($options);\n}<\/code><\/pre>\n<p>We zijn ge\u00efnteresseerd in wat er gebeurt als de statische methode op de router wordt gecalld. Dit kan lastig zijn vanwege het feit hoe facades werken, maar de volgende methode die wordt gecalld is als volgt:<\/p>\n<pre><code class=\"language-php\">\/**\nRegister the typical authentication routes for an application.\n\n@param array $options\n@return void\n*\/\npublic function auth(array $options = [])\n{\n    \/\/ Authentication Routes...\n    $this-&gt;get('login', 'AuthLoginController@showLoginForm')-&gt;name('login');\n    $this-&gt;post('login', 'AuthLoginController@login');\n    $this-&gt;post('logout', 'AuthLoginController@logout')-&gt;name('logout');\n\n    \/\/ Registration Routes...\n    if ($options['register'] ?? true) {\n        $this-&gt;get('register', 'AuthRegisterController@showRegistrationForm')-&gt;name('register');\n        $this-&gt;post('register', 'AuthRegisterController@register');\n    }\n   \n    \/\/ Password Reset Routes...\n    if ($options['reset'] ?? true) {\n        $this-&gt;resetPassword();\n    }\n\n    \/\/ Email Verification Routes...\n    if ($options['verify'] ?? false) {\n        $this-&gt;emailVerification();\n    }\n}   <\/code><\/pre>\n<p>Standaard genereert het alle routes behalve die van de e-mailverificatie. We zullen altijd de Login en Logout routes hebben, maar de andere kunnen we regelen via de opties array.<\/p>\n<p>Als we alleen login\/logout en registreren willen, kunnen we de volgende opties array doorgeven:<\/p>\n<pre><code class=\"language-php\">$options = [\"register\" =&gt; true, \"reset\" =&gt; false, \"verify\" =&gt; false];<\/code><\/pre>\n<h3>Routes en custom guards beschermen<\/h3>\n<p>We willen ervoor zorgen dat sommige routes alleen toegankelijk zijn voor geauthenticeerde gebruikers en dat kan snel door ofwel de middleware methode op de Route facade te callen, ofwel de middleware methode erop te chainen:<\/p>\n<pre><code class=\"language-php\">Route::middleware('auth')-&gt;get('\/user', function (Request $request) {\n    return $request-&gt;user();\n});\n\nRoute::get('\/user', function (Request $request) {\n    return $request-&gt;user();\n})-&gt;middleware('auth');<\/code><\/pre>\n<p>Deze guard zorgt ervoor dat inkomende verzoeken worden geauthenticeerd.<\/p>\n<h3>Wachtwoordbevestiging<\/h3>\n<p>Voor extra <a href=\"https:\/\/www.google.com\/url?q=https:\/\/kinsta.com\/blog\/website-security-check\/&#038;sa=D&#038;source=editors&#038;ust=1665232246677644&#038;usg=AOvVaw0bmAaBiRrNMk9bLYHwv1jZ\">beveiliging van de website<\/a> wil je vaak het wachtwoord van een gebruiker bevestigen voordat je verder gaat met een andere taak.<\/p>\n<p>We moeten een route defini\u00ebren vanuit de &#8220;bevestig wachtwoord&#8221; weergave om het verzoek af te handelen. Deze zal de gebruiker valideren en doorsturen naar de beoogde bestemming. Tegelijkertijd zorgen we ervoor dat ons wachtwoord bevestigd verschijnt in de sessie. Standaard moet het wachtwoord elke drie uur opnieuw bevestigd worden, maar dit kan veranderd worden in het configuratiebestand in <strong>config\/auth.php<\/strong>:<\/p>\n<pre><code class=\"language-php\">use IlluminateHttpRequest;\nuse IlluminateSupportFacadesHash;\nuse IlluminateSupportFacadesRedirect;\n\nRoute::post('\/confirm-password', function (Request $request) {\n    if (!Hash::check($request-&gt;password, $request-&gt;user()-&gt;password)) {\n        return back()-&gt;withErrors([\n            'password' =&gt; ['The provided password does not match our records.']\n        ]);\n    }\n\n    $request-&gt;session()-&gt;passwordConfirmed();\n\n    return redirect()-&gt;intended();\n})-&gt;middleware(['auth']);<\/code><\/pre>\n<h3>Authenticable contract<\/h3>\n<p>Het Authenticable contract in IlluminateContractsAuth definieert een blueprint van wat de UserProvider facade moet implementeren:<\/p>\n<pre><code class=\"language-php\">namespace IlluminateContractsAuth;\n\ninterface Authenticable \n{\n    public function getAuthIdentifierName();\n    \n    public function getAuthIdentifier();\n    \n    public function getAuthPassord();\n  \n    public function getRememberToken();\n\n    public function setRememberToken($value);\n  \n    public function getrememberTokenName();\n}<\/code><\/pre>\n<p>De interface laat het authenticatiesysteem werken met elke &#8220;user&#8221; klasse die deze implementeert.<\/p>\n<p>Dit geldt ongeacht welke ORM of opslaglagen worden gebruikt. Standaard heeft Laravel de AppModelsUser die deze interface implementeert, en dit is ook te zien in het configuratiebestand:<\/p>\n<pre><code class=\"language-php\">return [\n    'providers' =&gt; [\n        'users' =&gt; [\n            'driver' =&gt; 'eloquent',\n            'model' =&gt; AppModelsUser::class,\n        ],\n     ],\n];<\/code><\/pre>\n<h3>Authenticatie events<\/h3>\n<p>Er zijn tal van events die worden verzonden tijdens het hele authenticatieproces.<\/p>\n<p>Afhankelijk van je doelen kun je listeners aan die events koppelen in je <code>EventServiceProvider<\/code> .<\/p>\n<figure style=\"width: 1003px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/10\/Laravel-Listeners.png\" alt=\"Laravel Listeners\" width=\"1003\" height=\"1999\"><figcaption class=\"wp-caption-text\">Een lijst van Laravel listeners gegenereerd voor onze authenticatiedienst<\/figcaption><\/figure>\n<h3>Snel nieuwe gebruikers aanmaken<\/h3>\n<p>Snel een nieuwe gebruiker aanmaken kan via de <strong>AppUser<\/strong>:<\/p>\n<pre><code class=\"language-php\">$user = new AppUser();\n$user-&gt;password = Hash::make('strong_password');\n$user-&gt;email = 'test-email@user.com';\n$user-&gt;name = 'Username';\n$user-&gt;save();<\/code><\/pre>\n<p>Of via de create static methode op de User facade:<\/p>\n<pre><code class=\"language-php\">User::create([\n 'password' =&gt; Hash::make('strong-password'),\n 'email' =&gt; 'test-email@user.com',\n 'name' =&gt; 'username'\n]);<\/code><\/pre>\n<h2>Samenvatting<\/h2>\n<p>Het Laravel ecosysteem heeft veel starterkits om je app aan de gang te krijgen met een authenticatiesysteem, zoals Breeze en Jetstream. Ze zijn in hoge mate aanpasbaar omdat de code aan onze kant wordt gegenereerd, en we kunnen hem zoveel aanpassen als we willen, en hem zo nodig als blauwdruk gebruiken.<\/p>\n<p>Er zijn veel beveiligingsproblemen met betrekking tot authenticatie en de fijne kneepjes daarvan, maar die kunnen allemaal eenvoudig worden opgelost met de tools die Laravel biedt. Deze tools zijn in hoge mate aanpasbaar en gemakkelijk te gebruiken.<\/p>\n<p>Deploy je Laravel apps snel en effici\u00ebnt met onze snelle Laravel hostingdienst. Zie je app in actie met een <a href=\"https:\/\/kinsta.com\/nl\/registreren\/?product_type=app-db\">gratis trial<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Authenticatie is een van de meest kritische en essenti\u00eble features van webapplicaties. Webframeworks als Laravel bieden vele manieren om gebruikers te authenticeren. Je kunt Laravel authenticatiefeatures &#8230;<\/p>\n","protected":false},"author":267,"featured_media":51534,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[866],"class_list":["post-51533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-laravel"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Een uitgebreide handleiding voor Laravel authenticatie - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Een uitgebreide handleiding voor Laravel authenticatie\" \/>\n<meta property=\"og:description\" content=\"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-30T13:42:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-01T15:52:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Coman Cosmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_NL\" \/>\n<meta name=\"twitter:label1\" content=\"Geschreven door\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Een uitgebreide handleiding voor Laravel authenticatie\",\"datePublished\":\"2023-03-30T13:42:15+00:00\",\"dateModified\":\"2025-09-01T15:52:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/\"},\"wordCount\":2948,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg\",\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/\",\"name\":\"Een uitgebreide handleiding voor Laravel authenticatie - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg\",\"datePublished\":\"2023-03-30T13:42:15+00:00\",\"dateModified\":\"2025-09-01T15:52:08+00:00\",\"description\":\"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/nl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/nl\/onderwerpen\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Een uitgebreide handleiding voor Laravel authenticatie\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/nl\/#website\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snelle, veilige, premium hostingoplossingen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/nl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/nl\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/nl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/\",\"https:\/\/x.com\/Kinsta_NL\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"caption\":\"Coman Cosmin\"},\"description\":\"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.\",\"url\":\"https:\/\/kinsta.com\/nl\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Een uitgebreide handleiding voor Laravel authenticatie - Kinsta\u00ae","description":"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/","og_locale":"nl_NL","og_type":"article","og_title":"Een uitgebreide handleiding voor Laravel authenticatie","og_description":"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.","og_url":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","article_published_time":"2023-03-30T13:42:15+00:00","article_modified_time":"2025-09-01T15:52:08+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.","twitter_image":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg","twitter_creator":"@Kinsta_NL","twitter_site":"@Kinsta_NL","twitter_misc":{"Geschreven door":"Coman Cosmin","Geschatte leestijd":"18 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Een uitgebreide handleiding voor Laravel authenticatie","datePublished":"2023-03-30T13:42:15+00:00","dateModified":"2025-09-01T15:52:08+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/"},"wordCount":2948,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg","inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/","url":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/","name":"Een uitgebreide handleiding voor Laravel authenticatie - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg","datePublished":"2023-03-30T13:42:15+00:00","dateModified":"2025-09-01T15:52:08+00:00","description":"Verhoog de beveiliging van je web app met Laravel authenticatie. Ga aan de slag met de best practices voor beveiliging en leer om op een veilige manier toegang te verlenen.","breadcrumb":{"@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#primaryimage","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/03\/laravel-queue.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/nl\/blog\/laravel-authenticatie\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/nl\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/nl\/onderwerpen\/laravel\/"},{"@type":"ListItem","position":3,"name":"Een uitgebreide handleiding voor Laravel authenticatie"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/nl\/#website","url":"https:\/\/kinsta.com\/nl\/","name":"Kinsta\u00ae","description":"Snelle, veilige, premium hostingoplossingen","publisher":{"@id":"https:\/\/kinsta.com\/nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/nl\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/nl\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/nl\/wp-content\/uploads\/sites\/7\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/nl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Nederland-476213452787823\/","https:\/\/x.com\/Kinsta_NL","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/kinsta.com\/nl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","caption":"Coman Cosmin"},"description":"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.","url":"https:\/\/kinsta.com\/nl\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/51533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/comments?post=51533"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/51533\/revisions"}],"predecessor-version":[{"id":63239,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/posts\/51533\/revisions\/63239"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/translations\/dk"},{"href":"https:\/\/kinsta.com\/nl\/wp-json\/kinsta\/v1\/posts\/51533\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media\/51534"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/media?parent=51533"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/tags?post=51533"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/nl\/wp-json\/wp\/v2\/topic?post=51533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}