{"id":49836,"date":"2023-03-30T14:39:45","date_gmt":"2023-03-30T13:39:45","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=49836&#038;preview=true&#038;preview_id=49836"},"modified":"2025-09-01T16:51:36","modified_gmt":"2025-09-01T15:51:36","slug":"laravel-autentifikation","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/","title":{"rendered":"En omfattende guide til Laravel-autentifikation"},"content":{"rendered":"<p>Autentifikation er en af webapplikationernes mest kritiske og vigtige funktioner. Webframeworks som Laravel giver brugerne mange m\u00e5der at autentificere sig p\u00e5.<\/p>\n<p>Du kan implementere Laravel-godkendelsesfunktioner hurtigt og sikkert. Det kan dog v\u00e6re risikabelt at implementere disse autentificeringsfunktioner d\u00e5rligt, da ondsindede parter kan udnytte dem.<\/p>\n<p>I denne vejledning l\u00e6rer du alt det, du skal vide for at komme i gang med de valgte Laravel-godkendelsesmetoder.<\/p>\n<p>L\u00e6s videre!<\/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>En introduktion til Laravel-autentifikation<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/blog\/what-is-laravel\/\">Laravel<\/a> introducerer moduler, der best\u00e5r af &#8220;vagter&#8221; og &#8220;<a href=\"https:\/\/laravel.com\/docs\/9.x\/providers\">udbydere<\/a>&#8220;. Guards definerer brugergodkendelse for hver foresp\u00f8rgsel, og providers definerer brugerhentning fra <a href=\"https:\/\/kinsta.com\/dk\/blog\/persistent-storage\/\">vedvarende lagring<\/a> (f.eks. <a href=\"https:\/\/kinsta.com\/dk\/blog\/hvad-er-mysql\/\">MySQL-database<\/a>).<\/p>\n<p>Vi definerer vores autentificeringsparametre i en fil ved navn <code>config\/auth.php<\/code>. Den indeholder flere muligheder for at justere og \u00e6ndre Laravels autentifikationsadf\u00e6rd.<\/p>\n<p>F\u00f8rst skal du definere standardindstillingerne for autentificering. Denne indstilling styrer din applikations standardgodkendelses &#8220;vagt&#8221; og indstillinger for nulstilling af adgangskode. Du kan \u00e6ndre disse standardindstillinger efter behov, men de er en perfekt start for de fleste applikationer.<\/p>\n<p>Dern\u00e6st skal du definere godkendelsesvagter for din applikation. Her bruger vores standardkonfiguration sessionsopbevaring og Eloquent-brugerudbyderen. Alle godkendelsesdrivere har en brugerudbyder.<\/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; App\\Models\\User::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>Senere s\u00f8rger vi for, at alle godkendelsesdrivere har en brugerudbyder. Dette definerer, hvordan brugerne hentes fra din database eller andre lagringsmekanismer for at bevare dine brugerdata. Du kan konfigurere flere kilder, der repr\u00e6senterer hver model eller tabel, hvis du har flere brugertabeller eller modeller. Disse kilder kan tildeles alle ekstra godkendelsesvagter, som du har defineret.<\/p>\n<p>Brugere kan ogs\u00e5 \u00f8nske at nulstille deres passwords. I den forbindelse kan du angive flere konfigurationer for nulstilling af adgangskoder, hvis du har mere end \u00e9n brugertabel eller -model i programmet og \u00f8nsker separate indstillinger baseret p\u00e5 de specifikke brugertyper. Udl\u00f8bstiden er det antal minutter, som hvert nulstillingstoken er gyldigt. Denne sikkerhedsfunktion holder tokens med kort levetid, s\u00e5 de har mindre tid til at blive g\u00e6ttet. Du kan \u00e6ndre dette efter behov.<\/p>\n<p>I sidste ende skal du definere den tid, f\u00f8r en password-bekr\u00e6ftelse udl\u00f8ber, og brugeren bliver bedt om at indtaste sit password igen via bekr\u00e6ftelsessk\u00e6rmen. Som standard varer timeoutet tre timer.<\/p>\n<h2>Typer af Laravel autentifikationmetoder<\/h2>\n<p>Der er ikke nogen perfekt m\u00e5de at autentificere alle scenarier p\u00e5, men hvis du kender dem, kan du tr\u00e6ffe bedre beslutninger. Dette og hvordan Laravel udvikler sig med de nye funktioner i <a href=\"https:\/\/kinsta.com\/blog\/laravel-9\/\">Laravel 9<\/a>. Dette g\u00f8r vores arbejde som udviklere langt nemmere, n\u00e5r vi skifter autentifikationsmetoder.<\/p>\n<h3>Passwordbaseret autentificering<\/h3>\n<p>Som en rudiment\u00e6r m\u00e5de at autentificere en bruger p\u00e5, bruges den stadig af tusindvis af organisationer, men i betragtning af den nuv\u00e6rende udvikling er den helt klart ved at v\u00e6re for\u00e6ldet.<\/p>\n<p>Leverand\u00f8rerne skal h\u00e5ndh\u00e6ve komplekse password-implementeringer og samtidig sikre minimal friktion for slutbrugeren.<\/p>\n<p>Det fungerer ret ligetil, brugeren indtaster navn og adgangskode, og hvis der i databasen er et match mellem de to, beslutter serveren at godkende anmodningen og give brugeren adgang til ressourcerne i et foruddefineret tidsrum.<\/p>\n<h3>Tokenbaseret autentificering<\/h3>\n<p>Denne metode anvendes, hvor brugeren f\u00e5r udstedt et unikt token efter verifikation.<\/p>\n<p>Med dette token kan brugeren nu f\u00e5 adgang til de relevante ressourcer. Rettigheden er aktiv, indtil tokenet udl\u00f8ber.<\/p>\n<p>Mens tokenet er aktivt, beh\u00f8ver brugeren ikke at bruge noget brugernavn eller password, men n\u00e5r han\/hun henter et nyt token, skal disse to ting anvendes.<\/p>\n<p>Tokens anvendes i vid udstr\u00e6kning i flere scenarier i dag, da de er tilstandsl\u00f8se enheder, der indeholder alle autentificeringsdata.<\/p>\n<p>Hvis man kan adskille tokengenerering fra tokenverificering, giver det leverand\u00f8rerne stor fleksibilitet.<\/p>\n<h3>Multifaktor-autentificering<\/h3>\n<p>Som navnet antyder, indeb\u00e6rer det, at der anvendes mindst to autentifikationsfaktorer, hvilket \u00f8ger den sikkerhed, der opn\u00e5s.<\/p>\n<p>I mods\u00e6tning til <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-two-factor-authentication\/\">to-faktor-autentificering<\/a>, som kun involverer to faktorer, kan denne metode involvere to, tre, fire og flere faktorer&#8230;<\/p>\n<p>Den typiske implementering af denne metode indeb\u00e6rer, at man bruger en adgangskode, hvorefter brugeren f\u00e5r tilsendt en bekr\u00e6ftelseskode p\u00e5 sin smartphone. Leverand\u00f8rer, der implementerer denne metode, b\u00f8r v\u00e6re opm\u00e6rksomme p\u00e5 falske positiver og netv\u00e6rksafbrydelser, som kan blive store problemer, n\u00e5r de skalerer hurtigt op.<\/p>\n<h2>S\u00e5dan implementeres Laravel-autentificering<\/h2>\n<p>Dette afsnit vil l\u00e6re dig flere m\u00e5der at autentificere din applikations brugere p\u00e5. Nogle biblioteker som Jetstream, Breeze og Socialite har <a href=\"https:\/\/kinsta.com\/dk\/blog\/laravel-tutorial\/\">gratis tutorials<\/a> om, hvordan du bruger dem.<\/p>\n<h3>Manuel autentificering<\/h3>\n<p>Begynder med at registrere brugere og oprette de n\u00f8dvendige ruter i <code>routes\/web.php<\/code><strong>.<\/strong><\/p>\n<p>Vi vil oprette to ruter, en til at se formularen og en til at registrere:<\/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>Og oprette den controller, der er n\u00f8dvendig for disse:<\/p>\n<pre><code class=\"language-bash\">php artisan make controller Auth\/RegisterController -r<\/code><\/pre>\n<p>Opdater nu koden som f\u00f8lger:<\/p>\n<pre><code class=\"language-php\">namespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse illuminate\\Htpp\\Request;\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>Nu er controlleren tom og returnerer en visning, der skal registreres. Lad os lave denne visning i <code>resources\/views\/auth<\/code> og kalde den <code>register.blade.php<\/code>.<\/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 til registrering af brugere.\" width=\"1968\" height=\"1862\"><figcaption class=\"wp-caption-text\">Laravel blade view til registrering af brugere.<\/figcaption><\/figure>\n<p>Nu hvor alt er p\u00e5 plads, b\u00f8r vi bes\u00f8ge vores <code>\/register<\/code> rute og se f\u00f8lgende formular:<\/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=\"Registreringsformular til manuel autentificering.\" width=\"960\" height=\"264\"><figcaption id=\"caption-attachment-162747\" class=\"wp-caption-text\">Registreringsformular til manuel autentificering.<\/figcaption><\/figure>\n<p>Nu hvor vi kan vise en formular, som en bruger kan udfylde og f\u00e5 data til den, skal vi hente brugernes data, validere dem og derefter gemme dem i databasen, hvis alt er i orden. Her b\u00f8r du bruge en databasetransaktion for at sikre, at de data, du inds\u00e6tter, er komplette.<\/p>\n<p>Vi vil bruge Laravels funktion til validering af foresp\u00f8rgsler for at sikre, at alle tre legitimationsoplysninger er p\u00e5kr\u00e6vet. Vi skal sikre os, at e-mailen har et e-mail-format og er unik i tabellen <code>users<\/code>, og at adgangskoden er bekr\u00e6ftet og har mindst otte tegn:<\/p>\n<pre><code class=\"language-php\">namespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Foundation\\Auth\\User;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Hash;\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 hvor vores input er valideret, vil alt, der strider mod vores validering, give en fejl, der vises i formularen:<\/p>\n<p>[ccaption id=&#8221;attachment_162751&#8243; align=&#8221;alignnone&#8221; width=&#8221;960&#8243;]<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=\"Eksempel p\u00e5 ugyldigt input til registrering.\" width=\"960\" height=\"168\"> Eksempel p\u00e5 ugyldigt input til registrering.[\/caption]<\/p>\n<p>Hvis vi antager, at vi har oprettet en brugerkonto i metoden <code>store<\/code>, vil vi ogs\u00e5 logge brugeren ind. Der er to m\u00e5der, hvorp\u00e5 vi kan g\u00f8re det. Vi kan g\u00f8re det manuelt eller bruge <strong>Auth-facade<\/strong>.<\/p>\n<p>N\u00e5r brugeren logger ind, skal vi ikke sende ham\/hende tilbage til Registrer-sk\u00e6rmen, men i stedet til en ny side, f.eks. et dashboard eller en hjemmeside. Det er det, vi vil g\u00f8re her:<\/p>\n<pre><code class=\"language-php\">namespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider;\nuse Illuminate\\Foundation\\Auth\\User;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Illuminate\\Support\\Facades\\Hash;\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>Og nu hvor vi har en bruger registreret og logget ind <code>-n<\/code>, skal vi sikre os, at de sikkert kan logge ud.<\/p>\n<p>Laravel foresl\u00e5r, at vi ugyldigg\u00f8r sessionen og regenererer tokenet for sikkerhed efter en logout. Og det er netop det, vi skal g\u00f8re. Vi starter med at oprette en ny <code>\/logout<\/code> rute ved hj\u00e6lp af <strong>LogoutController&#8217;s <\/strong><code>destroy<\/code> metode:<\/p>\n<pre><code class=\"language-php\">use App\\Http\\Controllers\\Auth\\RegisterController;\nuse App\\Http\\Controllers\\Auth\\LogoutController;\nuse Illuminate\\Support\\Facades\\Route;\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>Det er meget vigtigt at sende logout gennem <code>auth<\/code> middleware. Brugerne skal ikke kunne f\u00e5 adgang til ruten, hvis de ikke er logget ind.<\/p>\n<p>Opret nu en controller, som vi gjorde f\u00f8r:<\/p>\n<pre><code class=\"language-bash\">php artisan make:controller Auth\/LogoutController -r<\/code><\/pre>\n<p>Vi kan sikre, at vi f\u00e5r anmodningen som en parameter i <code>destroy<\/code>-metoden. Vi logger brugeren ud via Auth-facaden, ugyldigg\u00f8r sessionen og regenererer tokenet, hvorefter vi omdirigerer brugeren til hjemmesiden:<\/p>\n<pre><code class=\"language-php\">namespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Auth;\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>Huskning af brugere<\/h3>\n<p>De fleste, hvis ikke alle, moderne webapplikationer har et afkrydsningsfelt &#8220;remember me&#8221; i deres loginformular.<\/p>\n<p>Hvis vi \u00f8nsker at levere en &#8220;husk mig&#8221;-funktionalitet, kan vi sende en boolsk v\u00e6rdi som det andet argument til fors\u00f8gsmetoden.<\/p>\n<p>N\u00e5r den er gyldig, vil Laravel holde brugeren autentificeret p\u00e5 ubestemt tid, eller indtil de bliver logget ud manuelt. Brugertabellen skal indeholde kolonnen string <code>remember_token<\/code> (det er derfor, vi regenererer tokens), hvor vi gemmer vores &#8220;husk mig&#8221;-token.<\/p>\n<p>Standardmigrationen for brugere indeholder den allerede.<\/p>\n<p>F\u00f8rst og fremmest skal du tilf\u00f8je feltet <strong>Remember Me<\/strong> til din formular:<\/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=\"Tilf\u00f8jelse af remember-me-feltet fra.\" width=\"1396\" height=\"596\"><figcaption class=\"wp-caption-text\">Tilf\u00f8jelse af remember-me-feltet fra.<\/figcaption><\/figure>\n<p>Og efter dette skal du hente legitimationsoplysningerne fra anmodningen og bruge dem p\u00e5 fors\u00f8gsmetoden p\u00e5 Auth-facaden.<\/p>\n<p>Hvis brugeren skulle blive husket, logger vi ham ind og omdirigerer ham til vores hjemmeside. Ellers kaster vi en fejl:<\/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 'email' =&gt; 'The provided credentials do not match our records.',\n ]);\n}<\/code><\/pre>\n<h3>Nulstilling af passwords<\/h3>\n<p>De fleste webapplikationer i dag giver brugerne mulighed for at nulstille deres passwords.<\/p>\n<p>Vi laver en anden rute til den glemte adgangskode og opretter controlleren som vi gjorde. Derudover vil vi tilf\u00f8je en rute til linket til nulstilling af password, der indeholder tokenet for hele processen:<\/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>Inde i butiksmetoden vil vi tage e-mailen fra anmodningen og validere den som vi gjorde.<\/p>\n<p>Herefter kan vi bruge <code>sendResetLink<\/code>-metoden fra password-facaden.<\/p>\n<p>Og derefter vil vi som svar returnere status, hvis det lykkedes at sende linket eller fejl ellers:<\/p>\n<pre><code class=\"language-php\">namespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Password;\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 hvor linket til nulstilling er blevet sendt til brugerens e-mail, skal vi tage os af logikken for, hvad der sker derefter.<\/p>\n<p>Vi f\u00e5r token, e-mail og nyt password i anmodningen og validerer dem.<\/p>\n<p>Herefter kan vi bruge reset-metoden fra password-facaden for at lade Laravel tage sig af alt andet bag kulisserne.<\/p>\n<p>Vi vil altid hash&#8217;e passwordet for at holde det sikkert.<\/p>\n<p>Til sidst vil vi kontrollere, om passwordet blev nulstillet, og hvis det var tilf\u00e6ldet, vil vi omdirigere brugeren til login-sk\u00e6rmen med en succesbesked. Ellers viser vi en fejlmeddelelse om, at det ikke kunne nulstilles:<\/p>\n<pre><code class=\"language-php\">namespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Support\\Facades\\Password;\nuse Illuminate\\Support\\Str;\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\/blog\/laravel-breeze\/\">Laravel Breeze<\/a> er en simpel implementering af Laravel-authentificationssfunktioner: login, registrering, nulstilling af password, e-mailbekr\u00e6ftelse og passwordbekr\u00e6ftelse. Du kan bruge den til at implementere autentificering i din nye Laravel-applikation.<\/p>\n<h3>Installation og ops\u00e6tning<\/h3>\n<p>N\u00e5r du har oprettet din Laravel-applikation, skal du blot konfigurere din database, k\u00f8re dine migreringer og installere laravel\/breeze-pakken via composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/breeze --dev<\/code><\/pre>\n<p>Herefter skal du k\u00f8re f\u00f8lgende:<\/p>\n<pre><code class=\"language-bash\">php artisan breeze:install<\/code><\/pre>\n<p>Dette vil offentligg\u00f8re dine autentifikationsvisninger, ruter, controllere og andre ressourcer, som den bruger. Efter dette trin har du fuld kontrol over alt det, som Breeze tilbyder.<\/p>\n<p>Nu skal vi rendere vores applikation til frontend, s\u00e5 vi vil installere vores JS-afh\u00e6ngigheder (som vil bruge @vite):<\/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>Herefter b\u00f8r links til login og registrering v\u00e6re p\u00e5 din hjemmeside, og alt b\u00f8r fungere uden problemer.<\/p>\n<h2>Laravel Jetstream<\/h2>\n<p>Laravel Jetstream udvider Laravel Breeze med nyttige funktioner og andre frontend stacks.<\/p>\n<p>Det giver login, registrering, e-mailbekr\u00e6ftelse, <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\">to-faktor-godkendelse<\/a>, sessionsh\u00e5ndtering, API-underst\u00f8ttelse via Sanctum og valgfri teamadministration.<\/p>\n<p>Du skal v\u00e6lge mellem Livewire og <a href=\"https:\/\/kinsta.com\/dk\/blog\/laravel-inertia\/\">Inertia<\/a> p\u00e5 frontend&#8217;en, n\u00e5r du installerer Jetstream. P\u00e5 backend bruger den Laravel Fortify, som er en frontend agnostisk, &#8220;headless&#8221; autentifikationsbackend til Laravel.<\/p>\n<h3>Installation og ops\u00e6tning<\/h3>\n<p>Vi installerer det gennem composer i vores Laravel-projekt:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/jetstream<\/code><\/pre>\n<p>Herefter k\u00f8rer vi kommandoen <code>php artisan jetstream:install [stack]<\/code>, som accepterer <code>[stack]<\/code> argumenter <code>Livewire<\/code> eller <code>Inertia<\/code>. Du kan videregive indstillingen <code>--teams<\/code>\u00a0for at aktivere holdfunktionen.<\/p>\n<p>Dette vil ogs\u00e5 installere 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> til test.<\/p>\n<p>Og til sidst skal vi rendere frontend af vores applikation ved hj\u00e6lp af f\u00f8lgende:<\/p>\n<pre><code class=\"language-php\">npm install\nnpm run dev<\/code><\/pre>\n<h2>Laravel Fortify<\/h2>\n<p>Laravel Fortify er en backend autentificeringsimplementering, der er frontend agnostisk. Du beh\u00f8ver ikke at bruge Laravel Fortify for at implementere Laravels autentifikationsfunktioner.<\/p>\n<p>Det bruges ogs\u00e5 i startpakker som Breeze og Jetstream. Du kan ogs\u00e5 bruge Fortify standalone, som blot er en backend-implementering. Hvis du bruger det standalone, skal din frontend kalde Fortify-ruterne.<\/p>\n<h3>Installation og ops\u00e6tning<\/h3>\n<p>Vi kan installere Fortify gennem composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/fortify<\/code><\/pre>\n<p>Nu skal vi udgive Fortify&#8217;s ressourcer:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish --provider=\"Laravel\\Fortify\\FortifyServiceProvider\"<\/code><\/pre>\n<p>Herefter opretter vi en ny <strong>app\/Actions-mappe<\/strong> ud over den nye <strong>FortifyServiceProvider<\/strong>, konfigurationsfilen og databasemigrationerne.<\/p>\n<p>Til sidst skal du k\u00f8re:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate<\/code><\/pre>\n<p>Eller:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh<\/code><\/pre>\n<p>Og din Fortify er klar til brug.<\/p>\n<h2>Laravel Socialite<\/h2>\n<p>Laravel indeholder en ukompliceret OAuth-baseret brugergodkendelsesfunktion. Den underst\u00f8tter sociale logins via Facebook, <a href=\"https:\/\/kinsta.com\/dk\/blog\/twitter-stats\/\">Twitter<\/a>, <a href=\"https:\/\/kinsta.com\/blog\/linkedin-statistics\/\">LinkedIn<\/a>, LinkedIn, Google, <a href=\"https:\/\/kinsta.com\/blog\/git-for-web-development\/\">Bitbucket, GitHub og GitLab<\/a>.<\/p>\n<h3>Installation<\/h3>\n<p>Vi kan installere det gennem composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/socialite<\/code><\/pre>\n<h3>Ops\u00e6tning og brug<\/h3>\n<p>N\u00e5r vi har installeret det, skal vi tilf\u00f8je legitimationsoplysningerne for den OAuth-udbyder, som vores program bruger. Vi vil tilf\u00f8je dem i <strong>config\/services.php<\/strong> for hver tjeneste.<\/p>\n<p>I konfigurationen skal vi matche n\u00f8glen med de tidligere tjenester. Nogle af disse n\u00f8gler omfatter:<\/p>\n<ul>\n<li>facebook<\/li>\n<li>twitter (til OAuth 1.0)<\/li>\n<li>twitter-oauth-2 (til 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>En tjenestekonfiguration kan se s\u00e5ledes ud:<\/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>Autentificering af brugere<\/h3>\n<p>Til denne handling har vi brug for to ruter, en til at omdirigere brugeren til OAuth-udbyderen:<\/p>\n<pre><code class=\"language-php\">use Laravel\\Socialite\\Facades\\Sociliate;\n\nRoute::get('\/auth\/redirect', function () {\n    return Socialite::driver('google')-&gt;redirect();\n});<\/code><\/pre>\n<p>Og en til callback fra udbyderen efter godkendelse:<\/p>\n<pre><code class=\"language-php\">use Laravel\\Socialite\\Facades\\Socialite;\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 leverer redirect-metoden, og facaden omdirigerer brugeren til OAuth-udbyderen, mens brugermetoden unders\u00f8ger den indg\u00e5ende anmodning og henter brugeroplysningerne.<\/p>\n<p>N\u00e5r vi har modtaget vores bruger, skal vi kontrollere, om den findes i vores database, og autentificere den. Hvis den ikke findes, opretter vi en ny post for at repr\u00e6sentere brugeren:<\/p>\n<pre><code class=\"language-php\">use App\\Models\\User;\nuse Illuminate\\Support\\Facades\\Auth;\nuse Laravel\\Socialite\\Facades\\Socialite;\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>Hvis vi \u00f8nsker at begr\u00e6nse brugerens adgangsintervaller, kan vi bruge metoden <code>scopes<\/code>, som vi inkluderer i godkendelsesanmodningen. Dette vil sammenf\u00f8je alle tidligere angivne anvendelsesomr\u00e5der med de angivne anvendelsesomr\u00e5der.<\/p>\n<p>Et alternativ til dette er at bruge metoden <code>setScopes<\/code>, som overskriver alle andre eksisterende omr\u00e5der:<\/p>\n<pre><code class=\"language-php\">use Laravel\\Socialite\\Facades\\Socialite;\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 hvor vi ved alt, og hvordan vi f\u00e5r en bruger efter callbacken, lad os se p\u00e5 nogle af de data, vi kan f\u00e5 fra den.<\/p>\n<p>OAuth1 User har <code>token<\/code> og <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 giver <code>token<\/code>, <code>refreshToken<\/code> og <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>B\u00e5de OAuth1 og OAuth2 leverer <code>getId<\/code>, <code>getNickname<\/code>, <code>getName<\/code>, <code>getEmail<\/code> og <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>Og hvis vi \u00f8nsker at f\u00e5 brugeroplysninger fra et token (OAuth 2) eller et token og en hemmelighed (OAuth 1), tilbyder Socialite to metoder til dette: <code>userFromToken<\/code> og <code>userFromTokenAndSecret<\/code>:<\/p>\n<pre><code class=\"language-php\">use Laravel\\Socialite\\Facades\\Socialite;\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 er et let autentificeringssystem til SPA&#8217;er (Single Page Applications) og mobilapps. Det giver brugerne mulighed for at generere flere API-tokens med specifikke scopes. Disse scopes specificerer tilladte handlinger af et token.<\/p>\n<h3>Anvendelser<\/h3>\n<p>Sanctum kan bruges til at udstede API-tokens til brugeren uden de indviklede OAuth-metoder. Disse tokens har typisk lange udl\u00f8bstider, f.eks. \u00e5r, men kan til enhver tid tilbagekaldes og genereres p\u00e5 ny af brugeren.<\/p>\n<h3>Installation og ops\u00e6tning<\/h3>\n<p>Vi kan installere det via composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/sanctum<\/code><\/pre>\n<p>Og vi skal udgive konfigurations- og migrationsfilerne:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish --provider=\"Laravel\\Sanctum\\SanctumServiceProvider\"<\/code><\/pre>\n<p>Nu hvor vi har genereret nye migreringsfiler, skal vi migrere dem:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh<\/code><\/pre>\n<h3>S\u00e5dan udsteder du API-tokens<\/h3>\n<p>F\u00f8r vi udsteder tokens, skal vores brugermodel bruge <strong>Laravel\\Sanctum\\HasApiTokens-tr\u00e6kket<\/strong>:<\/p>\n<pre><code class=\"language-php\">use Laravel\\Sanctum\\HasApiTokens;\n\nclass User extends Authenticable\n{\n    use HasApiTokens;\n}<\/code><\/pre>\n<p>N\u00e5r vi har brugeren, kan vi udstede et token ved at kalde <code>createToken<\/code>-metoden, som returnerer en <strong>Laravel\\Sanctum\\NewAccessToken-instans<\/strong>.<\/p>\n<p>Vi kan kalde <code>plainTextToken<\/code>-metoden p\u00e5 <strong>NewAccessToken-instansen<\/strong> for at se <strong>SHA-256-v\u00e6rdien<\/strong> i ren tekst for tokenet.<\/p>\n<h2>Tips og bedste praksis for Laravel-authentification<\/h2>\n<h3>Invalidering af sessioner p\u00e5 andre enheder<\/h3>\n<p>Som vi har diskuteret tidligere, er det afg\u00f8rende at invalidere sessionen, n\u00e5r brugeren logger ud, men det b\u00f8r ogs\u00e5 v\u00e6re tilg\u00e6ngeligt som en mulighed for alle de ejede enheder.<\/p>\n<p>Denne funktion bruges normalt, n\u00e5r brugeren \u00e6ndrer eller opdaterer sit password, og vi \u00f8nsker at invalidere deres session fra enhver anden enhed.<\/p>\n<p>Med Auth-facaden er dette en let opgave at udf\u00f8re. I betragtning af at den rute, vi bruger, har <code>auth<\/code> og <code>auth.session middleware<\/code>, kan vi bruge den statiske metode <code>logoutOtherDevices<\/code> i facaden:<\/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 Illuminate\\Support\\Facades\\Auth;\n\nAuth::logoutOtherDevices($password);<\/code><\/pre>\n<h3>Konfiguration med Auth::routes()<\/h3>\n<p>Metoden routes i Auth-facaden er blot en hj\u00e6lper til at generere alle de ruter, der er n\u00f8dvendige for brugergodkendelse.<\/p>\n<p>Ruterne omfatter Login (Get, Post), Logout (Post), Register (Get, Post) og Password Reset\/Email (Get, Post).<\/p>\n<p>N\u00e5r du kalder metoden p\u00e5 facaden, g\u00f8r den f\u00f8lgende:<\/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>Vi er interesseret i, hvad der sker, n\u00e5r den statiske metode kaldes p\u00e5 routeren. Dette kan v\u00e6re tricky p\u00e5 grund af hvordan facaderne fungerer, men f\u00f8lgende metode kaldes s\u00e5dan her:<\/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', 'Auth\\LoginController@showLoginForm')-&gt;name('login');\n    $this-&gt;post('login', 'Auth\\LoginController@login');\n    $this-&gt;post('logout', 'Auth\\LoginController@logout')-&gt;name('logout');\n\n    \/\/ Registration Routes...\n    if ($options['register'] ?? true) {\n        $this-&gt;get('register', 'Auth\\RegisterController@showRegistrationForm')-&gt;name('register');\n        $this-&gt;post('register', 'Auth\\RegisterController@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>Som standard genererer den alle ruter ud over den til e-mailbekr\u00e6ftelse. Vi vil altid have ruterne Login og Logout, men de andre ruter kan vi styre via options arrayet.<\/p>\n<p>Hvis vi kun vil have login\/logout og register, kan vi sende f\u00f8lgende options array:<\/p>\n<pre><code class=\"language-php\">$options = [\"register\" =&gt; true, \"reset\" =&gt; false, \"verify\" =&gt; false];<\/code><\/pre>\n<h3>Beskyttelse af ruter og brugerdefinerede vagter<\/h3>\n<p>Vi \u00f8nsker at sikre, at nogle ruter kun kan tilg\u00e5s af autentificerede brugere, og det kan hurtigt g\u00f8res ved at tilf\u00f8je enten at kalde middleware-metoden p\u00e5 Route-facaden eller k\u00e6de middleware-metoden p\u00e5 den:<\/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>Denne vagt sikrer, at indg\u00e5ende anmodninger er autentificeret.<\/p>\n<h3>Bekr\u00e6ftelse af password<\/h3>\n<p>For at \u00f8ge <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\">sikkerheden p\u00e5 webstedet<\/a> \u00f8nsker man ofte at bekr\u00e6fte en brugers adgangskode, f\u00f8r man g\u00e5r videre med en anden opgave.<\/p>\n<p>Vi skal definere en rute fra visningen Bekr\u00e6ft adgangskode for at h\u00e5ndtere anmodningen. Den vil validere og omdirigere brugeren til den \u00f8nskede destination. Samtidig vil vi s\u00f8rge for, at vores password vises bekr\u00e6ftet i sessionen. Som standard skal adgangskoden genbekr\u00e6ftes hver tredje time, men dette kan \u00e6ndres i konfigurationsfilen p\u00e5 <strong>config\/auth.php<\/strong>:<\/p>\n<pre><code class=\"language-php\">use Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Support\\Facades\\Redirect;\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 kontrakt<\/h3>\n<p>Authenticable-kontrakten, der findes p\u00e5 Illuminate\\Contracts\\Auth, definerer et blueprint af, hvad UserProvider-facaden skal implementere:<\/p>\n<pre><code class=\"language-php\">namespace Illuminate\\Contracts\\Auth;\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>Gr\u00e6nsefladen g\u00f8r det muligt for autentificeringssystemet at arbejde med enhver &#8220;bruger&#8221;-klasse, der implementerer den.<\/p>\n<p>Dette g\u00e6lder uanset hvilke ORM- eller lagringslag der anvendes. Som standard har Laravel App\\Models\\User, der implementerer denne gr\u00e6nseflade, og dette kan ogs\u00e5 ses i konfigurationsfilen:<\/p>\n<pre><code class=\"language-php\">return [\n    'providers' =&gt; [\n        'users' =&gt; [\n            'driver' =&gt; 'eloquent',\n            'model' =&gt; App\\Models\\User::class,\n        ],\n     ],\n];<\/code><\/pre>\n<h3>Authentication Events<\/h3>\n<p>Der er masser af begivenheder, der sendes i l\u00f8bet af hele autentifikationsprocessen.<\/p>\n<p>Afh\u00e6ngigt af dine m\u00e5l kan du knytte lyttere til disse h\u00e6ndelser i din <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 lyttere\" width=\"1003\" height=\"1999\"><figcaption class=\"wp-caption-text\">En liste over Laravel-lyttere genereret til vores autentificeringstjeneste<\/figcaption><\/figure>\n<h3>Hurtigt oprette nye brugere<\/h3>\n<p>Oprettelse af en ny bruger hurtigt kan g\u00f8res gennem <strong>App\\User<\/strong>:<\/p>\n<pre><code class=\"language-php\">$user = new App\\User();\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>Eller gennem den statiske metode create static metode p\u00e5 User facaden:<\/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>Opsummering<\/h2>\n<p>Laravel-\u00f8kosystemet har en masse startpakker til at f\u00e5 din app op at k\u00f8re med et autentifikationssystem, som Breeze og Jetstream. De kan i h\u00f8j grad tilpasses, da koden genereres p\u00e5 vores side, og vi kan \u00e6ndre den s\u00e5 meget som vi vil, og bruge den som et blueprint, hvis det er n\u00f8dvendigt.<\/p>\n<p>Der er mange sikkerhedsm\u00e6ssige bekymringer vedr\u00f8rende autentificering og dens sn\u00f8rklede detaljer, men alle disse kan nemt l\u00f8ses gennem de v\u00e6rkt\u00f8jer, som Laravel tilbyder. Disse v\u00e6rkt\u00f8jer kan i h\u00f8j grad tilpasses og er nemme at bruge.<\/p>\n<p>Implementer dine Laravel-apps hurtigt og effektivt med vores hurtige Laravel-hostingtjeneste. Se din app i aktion med en <a href=\"https:\/\/kinsta.com\/dk\/tilmelding\/?product_type=app-db\">gratis pr\u00f8veperiode<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Autentifikation er en af webapplikationernes mest kritiske og vigtige funktioner. Webframeworks som Laravel giver brugerne mange m\u00e5der at autentificere sig p\u00e5. Du kan implementere Laravel-godkendelsesfunktioner hurtigt &#8230;<\/p>\n","protected":false},"author":267,"featured_media":50347,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[712],"class_list":["post-49836","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>En omfattende guide til Laravel-autentifikation - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.\" \/>\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\/dk\/blog\/laravel-autentifikation\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"En omfattende guide til Laravel-autentifikation\" \/>\n<meta property=\"og:description\" content=\"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-30T13:39:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-01T15:51:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg\" \/>\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=\"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"En omfattende guide til Laravel-autentifikation\",\"datePublished\":\"2023-03-30T13:39:45+00:00\",\"dateModified\":\"2025-09-01T15:51:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/\"},\"wordCount\":2910,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg\",\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/\",\"name\":\"En omfattende guide til Laravel-autentifikation - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg\",\"datePublished\":\"2023-03-30T13:39:45+00:00\",\"dateModified\":\"2025-09-01T15:51:36+00:00\",\"description\":\"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg\",\"width\":1460,\"height\":730,\"caption\":\"En omfattende guide til Laravel-autentifikation\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"En omfattende guide til Laravel-autentifikation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"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\/dk\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"En omfattende guide til Laravel-autentifikation - Kinsta\u00ae","description":"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.","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\/dk\/blog\/laravel-autentifikation\/","og_locale":"da_DK","og_type":"article","og_title":"En omfattende guide til Laravel-autentifikation","og_description":"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.","og_url":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2023-03-30T13:39:45+00:00","article_modified_time":"2025-09-01T15:51:36+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg","twitter_creator":"@kinsta_dk","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Coman Cosmin","Estimeret l\u00e6setid":"17 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"En omfattende guide til Laravel-autentifikation","datePublished":"2023-03-30T13:39:45+00:00","dateModified":"2025-09-01T15:51:36+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/"},"wordCount":2910,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg","inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/","url":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/","name":"En omfattende guide til Laravel-autentifikation - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg","datePublished":"2023-03-30T13:39:45+00:00","dateModified":"2025-09-01T15:51:36+00:00","description":"For\u00f8g din webapps sikkerhed med Laravel-authentification. Kom godt i gang med bedste sikkerhedspraksis, og l\u00e6r at give sikker adgang.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/03\/laravel-autentifikation.jpeg","width":1460,"height":730,"caption":"En omfattende guide til Laravel-autentifikation"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/laravel-autentifikation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/dk\/emner\/laravel\/"},{"@type":"ListItem","position":3,"name":"En omfattende guide til Laravel-autentifikation"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","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\/dk\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/49836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=49836"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/49836\/revisions"}],"predecessor-version":[{"id":55292,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/49836\/revisions\/55292"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/translations\/dk"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/49836\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/50347"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=49836"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=49836"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=49836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}