{"id":58544,"date":"2023-08-20T10:42:56","date_gmt":"2023-08-20T13:42:56","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=58544&#038;preview=true&#038;preview_id=58544"},"modified":"2025-09-01T12:52:17","modified_gmt":"2025-09-01T15:52:17","slug":"autenticacao-laravel","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/","title":{"rendered":"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel"},"content":{"rendered":"<p>A autentica\u00e7\u00e3o \u00e9 uma das caracter\u00edsticas mais cr\u00edticas e essenciais dos aplicativos web. Frameworks web como o Laravel oferecem diversas maneiras para os usu\u00e1rios se autenticarem.<\/p>\n<p>\u00c9 poss\u00edvel implementar rapidamente os recursos de autentica\u00e7\u00e3o do Laravel de forma segura. No entanto, uma implementa\u00e7\u00e3o inadequada desses recursos pode ser arriscada, j\u00e1 que indiv\u00edduos mal-intencionados podem se aproveitar disso.<\/p>\n<p>Este guia ensinar\u00e1 tudo o que voc\u00ea precisa saber para come\u00e7ar com os m\u00e9todos de autentica\u00e7\u00e3o do Laravel de sua escolha.<\/p>\n<p>Continue lendo!<\/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>Uma introdu\u00e7\u00e3o \u00e0 autentica\u00e7\u00e3o no Laravel<\/h2>\n<p>O <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-laravel\/\">Laravel<\/a>\u00a0introduz m\u00f3dulos compostos por &#8220;guards&#8221; (guardi\u00f5es) e &#8220;<a href=\"https:\/\/laravel.com\/docs\/9.x\/providers\">providers<\/a>&#8221; (provedores). Os guardi\u00f5es definem a autentica\u00e7\u00e3o do usu\u00e1rio para cada requisi\u00e7\u00e3o, e os provedores definem a recupera\u00e7\u00e3o do usu\u00e1rio a partir de <a href=\"https:\/\/kinsta.com\/pt\/blog\/armazenamento-persistente\/\">armazenamento persistente<\/a> (por exemplo, banco de dados <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-mysql\/\">MySQL<\/a>).<\/p>\n<p>Definimos nossos par\u00e2metros de autentica\u00e7\u00e3o em um arquivo chamado <code>config\/auth.php<\/code>. Ele inclui v\u00e1rias op\u00e7\u00f5es para ajustar e modificar o comportamento de autentica\u00e7\u00e3o de Laravel.<\/p>\n<p>Primeiro, voc\u00ea precisa definir os padr\u00f5es de autentica\u00e7\u00e3o. Esta op\u00e7\u00e3o controla o &#8220;guard&#8221; (guardi\u00e3o) de autentica\u00e7\u00e3o padr\u00e3o do seu aplicativo e as op\u00e7\u00f5es de redefini\u00e7\u00e3o de senha. Voc\u00ea pode alterar esses padr\u00f5es conforme necess\u00e1rio, mas eles s\u00e3o um \u00f3timo ponto de partida para a maioria dos aplicativos.<\/p>\n<p>Em seguida, voc\u00ea define os guardi\u00f5es de autentica\u00e7\u00e3o para o seu aplicativo. Aqui, nossa configura\u00e7\u00e3o padr\u00e3o utiliza armazenamento de sess\u00e3o e o provedor de usu\u00e1rio Eloquent. Todos os drivers de autentica\u00e7\u00e3o t\u00eam um provedor de usu\u00e1rio.<\/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>Mais tarde, garantimos que todos os drivers de autentica\u00e7\u00e3o tenham um provedor de usu\u00e1rio. Isso define como os usu\u00e1rios s\u00e3o recuperados do seu banco de dados ou outros mecanismos de armazenamento para persistir os dados do seu usu\u00e1rio. Voc\u00ea pode configurar m\u00faltiplas fontes representando cada modelo ou tabela se tiver v\u00e1rias tabelas ou modelos de usu\u00e1rios. Essas fontes podem ser atribu\u00eddas a quaisquer guardi\u00f5es de autentica\u00e7\u00e3o extras que voc\u00ea tenha definido.<\/p>\n<p>Os usu\u00e1rios tamb\u00e9m podem querer redefinir suas senhas. Para isso, voc\u00ea pode especificar m\u00faltiplas configura\u00e7\u00f5es de redefini\u00e7\u00e3o de senha se tiver mais de uma tabela ou modelo de usu\u00e1rio no aplicativo e quiser configura\u00e7\u00f5es separadas com base nos tipos espec\u00edficos de usu\u00e1rio. O tempo de expira\u00e7\u00e3o \u00e9 o n\u00famero de minutos que cada token de redefini\u00e7\u00e3o ser\u00e1 v\u00e1lido. Esse recurso de seguran\u00e7a mant\u00e9m os tokens com vida \u00fatil curta, para que tenham menos tempo para serem adivinhados. Voc\u00ea pode alterar isso conforme necess\u00e1rio.<\/p>\n<p>Por fim, voc\u00ea deve definir o tempo antes de uma confirma\u00e7\u00e3o de senha expirar, e o usu\u00e1rio \u00e9 solicitado a reinserir sua senha na tela de confirma\u00e7\u00e3o. Por padr\u00e3o, o tempo de espera dura tr\u00eas horas.<\/p>\n<h2>Tipos de m\u00e9todos de autentica\u00e7\u00e3o no Laravel<\/h2>\n<p>N\u00e3o existe uma maneira perfeita de autenticar cada cen\u00e1rio, mas conhec\u00ea-los ajudar\u00e1 a tomar decis\u00f5es melhores. Isso e como o Laravel est\u00e1 evoluindo com as novas funcionalidades no <a href=\"https:\/\/kinsta.com\/pt\/blog\/laravel-9\/\">Laravel 9<\/a>. Isso torna nosso trabalho como desenvolvedores muito mais f\u00e1cil ao mudar os modos de autentica\u00e7\u00e3o.<\/p>\n<h3>Autentica\u00e7\u00e3o baseada em senha<\/h3>\n<p>Como uma forma rudimentar de autenticar um usu\u00e1rio, ele ainda \u00e9 usado por milhares de organiza\u00e7\u00f5es, mas considerando o desenvolvimento atual, ele est\u00e1 claramente se tornando ultrapassado.<\/p>\n<p>Os fornecedores devem impor implementa\u00e7\u00f5es de senhas complexas, garantindo ao mesmo tempo, fric\u00e7\u00e3o m\u00ednima para o usu\u00e1rio final.<\/p>\n<p>Funciona de forma bem direta, o usu\u00e1rio insere o nome e a senha e, se no banco de dados houver uma correspond\u00eancia entre os dois, o servidor decide autenticar a solicita\u00e7\u00e3o e permite que o usu\u00e1rio acesse os recursos por um tempo predefinido.<\/p>\n<h3>Autentica\u00e7\u00e3o baseada em tokens<\/h3>\n<p>Esta metodologia \u00e9 usada onde o usu\u00e1rio recebe um token \u00fanico ap\u00f3s a verifica\u00e7\u00e3o.<\/p>\n<p>Tendo este token, agora o usu\u00e1rio pode acessar recursos relevantes. O privil\u00e9gio est\u00e1 ativo at\u00e9 que o token expire.<\/p>\n<p>Enquanto o token estiver ativo, o usu\u00e1rio n\u00e3o tem que usar nenhum nome de usu\u00e1rio ou senha, mas ao recuperar um novo token, esses dois s\u00e3o necess\u00e1rios.<\/p>\n<p>Tokens s\u00e3o amplamente utilizados em m\u00faltiplos cen\u00e1rios hoje, pois s\u00e3o entidades sem estado que cont\u00eam todos os dados de autentica\u00e7\u00e3o.<\/p>\n<p>Fornecer uma maneira de separar a gera\u00e7\u00e3o do token da verifica\u00e7\u00e3o do token oferece aos fornecedores muita flexibilidade.<\/p>\n<h3>Autentica\u00e7\u00e3o de m\u00faltiplos fatores<\/h3>\n<p>Como o nome sugere, isso implica em usar pelo menos dois fatores de autentica\u00e7\u00e3o, elevando a seguran\u00e7a que ela proporciona.<\/p>\n<p>Ao contr\u00e1rio da <a href=\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-de-dois-fatores-wordpress\/\">autentica\u00e7\u00e3o de dois fatores<\/a> que envolve apenas dois fatores, este m\u00e9todo pode envolver dois, tr\u00eas, quatro, e mais&#8230;<\/p>\n<p>A implementa\u00e7\u00e3o t\u00edpica deste m\u00e9todo envolve o uso de uma senha, ap\u00f3s a qual o usu\u00e1rio recebe um c\u00f3digo de verifica\u00e7\u00e3o em seu smartphone. Os fornecedores que implementam este m\u00e9todo devem procurar por falsos positivos e quedas de rede, que podem se tornar grandes problemas enquanto aumentam a escala rapidamente.<\/p>\n<h2>Como implementar a autentica\u00e7\u00e3o no Laravel<\/h2>\n<p>Esta se\u00e7\u00e3o ensinar\u00e1 v\u00e1rias maneiras de autenticar os usu\u00e1rios do seu aplicativo. Algumas bibliotecas como Jetstream, Breeze e Socialite t\u00eam <a href=\"https:\/\/kinsta.com\/pt\/blog\/tutoriais-laravel\/\">tutoriais gratuitos<\/a> sobre como us\u00e1-las.<\/p>\n<h3>Autentica\u00e7\u00e3o manual<\/h3>\n<p>Come\u00e7ando com o registro de usu\u00e1rios e a cria\u00e7\u00e3o das rotas necess\u00e1rias em <code>routes\/web.php<\/code><strong>.<\/strong><\/p>\n<p>Criaremos duas rotas, uma para visualizar o formul\u00e1rio e outra para registrar:<\/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>E criar o controlador necess\u00e1rio para eles:<\/p>\n<pre><code class=\"language-bash\">php artisan make controller Auth\/RegisterController -r<\/code><\/pre>\n<p>Agora atualize o c\u00f3digo da seguinte forma:<\/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>O controlador est\u00e1 vazio agora e retorna uma vis\u00e3o para o registro. Vamos criar essa vis\u00e3o em <code>resources\/views\/auth<\/code> e cham\u00e1-la de <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 para registro de usu\u00e1rios.\" width=\"1968\" height=\"1862\"><figcaption class=\"wp-caption-text\">Laravel blade view para registro de usu\u00e1rios.<\/figcaption><\/figure>\n<p>Agora com tudo no lugar, devemos visitar nossa rota <code>\/register<\/code> e ver o seguinte formul\u00e1rio:<\/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=\"Formul\u00e1rio de registro para autentica\u00e7\u00e3o manual.\" width=\"960\" height=\"264\"><figcaption id=\"caption-attachment-162747\" class=\"wp-caption-text\">Formul\u00e1rio de registro para autentica\u00e7\u00e3o manual.<\/figcaption><\/figure>\n<p>Agora que podemos exibir um formul\u00e1rio que um usu\u00e1rio pode preencher e obter os dados dele, devemos obter os dados dos usu\u00e1rios, valid\u00e1-los e, em seguida, armazen\u00e1-los no banco de dados se tudo estiver correto. Aqui, voc\u00ea deve usar uma transa\u00e7\u00e3o de banco de dados para garantir que os dados inseridos estejam completos.<\/p>\n<p>Usaremos o recurso de valida\u00e7\u00e3o de requisi\u00e7\u00e3o do Laravel para garantir que as tr\u00eas credenciais sejam obrigat\u00f3rias. Precisamos ter certeza de que o e-mail tem um formato de e-mail e \u00e9 \u00fanico na tabela <code>users<\/code> e que a senha \u00e9 confirmada e tem um m\u00ednimo de oito caracteres:<\/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>Agora que nossa entrada foi validada, qualquer coisa que v\u00e1 contra nossa valida\u00e7\u00e3o lan\u00e7ar\u00e1 um erro que ser\u00e1 exibido no formul\u00e1rio:<\/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=\"Exemplo de entrada inv\u00e1lida para registro.\" width=\"960\" height=\"168\"><figcaption id=\"caption-attachment-162751\" class=\"wp-caption-text\">Exemplo de entrada inv\u00e1lida para registro.<\/figcaption><\/figure>\n<p>Assumindo que tenhamos criado uma conta de usu\u00e1rio no m\u00e9todo <code>store<\/code>, tamb\u00e9m queremos fazer o login do usu\u00e1rio. H\u00e1 duas maneiras de fazermos isso. Podemos fazer isso manualmente ou usar <strong>Auth facade<\/strong>.<\/p>\n<p>Ap\u00f3s o login do usu\u00e1rio, n\u00e3o devemos devolv\u00ea-los \u00e0 tela de Registro, mas sim a uma nova p\u00e1gina, como um painel de controle ou p\u00e1gina inicial. Isso \u00e9 o que vamos fazer aqui:<\/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>E agora que temos um usu\u00e1rio registrado e logado <code>-n<\/code>, devemos nos certificar de que ele possa sair do site com seguran\u00e7a.<\/p>\n<p>O Laravel sugere que invalidemos a sess\u00e3o e regeneremos o token por motivos de seguran\u00e7a ap\u00f3s o logout. E \u00e9 exatamente isso que vamos fazer. Come\u00e7amos criando uma nova rota <code>\/logout<\/code> usando o m\u00e9todo <code>destroy<\/code> do <strong>LogoutController<\/strong>:<\/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>Passar o logout atrav\u00e9s do middleware <code>auth<\/code> \u00e9 muito importante. Os usu\u00e1rios devem ser incapazes de acessar a rota se n\u00e3o estiverem logados.<\/p>\n<p>Agora, crie um controlador como fizemos antes:<\/p>\n<pre><code class=\"language-bash\">php artisan make:controller Auth\/LogoutController -r<\/code><\/pre>\n<p>Podemos garantir que recebamos a requisi\u00e7\u00e3o como um par\u00e2metro no m\u00e9todo <code>destroy<\/code>. Desconectamos o usu\u00e1rio atrav\u00e9s do Auth facade, invalidamos a sess\u00e3o e regeneramos o token, depois redirecionamos o usu\u00e1rio para a p\u00e1gina inicial:<\/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>Lembrando os usu\u00e1rios<\/h3>\n<p>A maioria, sen\u00e3o todos, dos aplicativos web modernos oferece uma op\u00e7\u00e3o &#8220;lembrar de mim&#8221; em seu formul\u00e1rio de login.<\/p>\n<p>Se quisermos fornecer uma funcionalidade &#8220;lembrar de mim&#8221;, podemos passar um valor booleano como segundo argumento para o m\u00e9todo attempt.<\/p>\n<p>Quando v\u00e1lido, Laravel manter\u00e1 o usu\u00e1rio autenticado indefinidamente ou at\u00e9 que eles sejam desconectados manualmente. A tabela de usu\u00e1rios deve incluir a string <code>remember_token<\/code> (\u00e9 por isso que regeneramos os tokens), onde armazenaremos nosso token &#8220;lembrar de mim&#8221;.<\/p>\n<p>A migra\u00e7\u00e3o padr\u00e3o para os usu\u00e1rios j\u00e1 a inclui.<\/p>\n<p>Primeiro, voc\u00ea tem que adicionar o campo <strong>Remember Me<\/strong> ao seu formul\u00e1rio:<\/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=\"Adicionando o campo \"lembrar de mim\" no formul\u00e1rio.\" width=\"1396\" height=\"596\"><figcaption class=\"wp-caption-text\">Adicionando o campo &#8220;lembrar de mim&#8221; no formul\u00e1rio.<\/figcaption><\/figure>\n<p>E depois disso, obtenha as credenciais do pedido e use-as no m\u00e9todo de tentativa no Auth facade.<\/p>\n<p>Se o usu\u00e1rio deve ser lembrado, n\u00f3s o conectaremos e o redirecionaremos para nossa p\u00e1gina inicial. Caso contr\u00e1rio, lan\u00e7aremos um erro:<\/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>Redefini\u00e7\u00e3o de senhas<\/h3>\n<p>A maioria dos aplicativos web de hoje fornecem maneiras para os usu\u00e1rios redefinirem suas senhas.<\/p>\n<p>Faremos outra rota para a senha esquecida e criaremos o controlador como fizemos. Al\u00e9m disso, adicionaremos uma rota para o link da senha de reset que cont\u00e9m o token para todo o processo:<\/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>Dentro do m\u00e9todo &#8220;store&#8221;, pegaremos o e-mail da requisi\u00e7\u00e3o e validaremos como fizemos anteriormente.<\/p>\n<p>Ap\u00f3s isso, podemos usar o m\u00e9todo &#8220;<code>sendResetLink<\/code> &#8221; da facade &#8220;password&#8221;.<\/p>\n<p>E ent\u00e3o, como resposta, queremos retornar o status se teve sucesso em enviar o link ou erros, caso contr\u00e1rio:<\/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>Agora que o link de redefini\u00e7\u00e3o foi enviado para o e-mail do usu\u00e1rio, devemos cuidar da l\u00f3gica do que acontece depois disso.<\/p>\n<p>Vamos pegar o token, e-mail e a nova senha na requisi\u00e7\u00e3o e valid\u00e1-los.<\/p>\n<p>Depois disso, podemos usar o m\u00e9todo &#8220;reset&#8221; da facade &#8220;password&#8221; para deixar o Laravel cuidar de todo o resto nos bastidores.<\/p>\n<p>Sempre vamos fazer o hash da senha para mant\u00ea-la segura.<\/p>\n<p>No final, vamos verificar se a senha foi redefinida, e se foi, redirecionaremos o usu\u00e1rio para a tela de login com uma mensagem de sucesso. Caso contr\u00e1rio, exibiremos um erro informando que n\u00e3o foi poss\u00edvel redefini-la:<\/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\/pt\/blog\/laravel-breeze\/\">Laravel Breeze<\/a> \u00e9 uma implementa\u00e7\u00e3o simples dos recursos de autentica\u00e7\u00e3o Laravel: login, registro, redefini\u00e7\u00e3o de senha, verifica\u00e7\u00e3o de e-mail e confirma\u00e7\u00e3o de senha. Voc\u00ea pode us\u00e1-lo para implementar a autentica\u00e7\u00e3o em seu novo aplicativo Laravel.<\/p>\n<h3>Instala\u00e7\u00e3o e configura\u00e7\u00e3o<\/h3>\n<p>Ap\u00f3s criar seu aplicativo Laravel, tudo que voc\u00ea tem que fazer \u00e9 configurar seu banco de dados, executar suas migra\u00e7\u00f5es e instalar o pacote Laravel\/breeze atrav\u00e9s do Composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/breeze --dev<\/code><\/pre>\n<p>Ap\u00f3s isso, execute o seguinte:<\/p>\n<pre><code class=\"language-bash\">php artisan breeze:install<\/code><\/pre>\n<p>Isso publicar\u00e1 suas visualiza\u00e7\u00f5es de autentica\u00e7\u00e3o, rotas, controladores e outros recursos que ele usa. Ap\u00f3s esta etapa, voc\u00ea tem controle total sobre tudo que o Breeze oferece.<\/p>\n<p>Agora temos que renderizar nosso aplicativo no frontend, ent\u00e3o instalaremos nossas depend\u00eancias JS (que usar\u00e3o @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>Depois disso, os links para login e registro devem estar em sua p\u00e1gina inicial, e tudo deve funcionar sem problemas.<\/p>\n<h2>Laravel Jetstream<\/h2>\n<p>Laravel Jetstream estende o Laravel Breeze com funcionalidades \u00fateis e outras pilhas frontend.<\/p>\n<p>Ele fornece login, registro, verifica\u00e7\u00e3o de e-mail, <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\">autentica\u00e7\u00e3o de dois fatores<\/a>, gerenciamento de sess\u00e3o, suporte API via Sanctum, e gerenciamento de equipe opcional.<\/p>\n<p>Voc\u00ea deve escolher entre Livewire e <a href=\"https:\/\/kinsta.com\/pt\/blog\/laravel-breeze\/\">Inertia<\/a> no frontend ao instalar o Jetstream. No backend, ele usa Laravel Fortify, que \u00e9 um frontend agn\u00f3stico, &#8220;headless&#8221; de autentica\u00e7\u00e3o para Laravel.<\/p>\n<h3>Instala\u00e7\u00e3o e configura\u00e7\u00e3o<\/h3>\n<p>Vamos instal\u00e1-lo atrav\u00e9s do Composer no nosso Projeto Laravel:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/jetstream<\/code><\/pre>\n<p>Depois disso, executaremos o comando <code>php artisan jetstream:install [stack]<\/code>, que aceita <code>[stack]<\/code> argumentos <code>Livewire<\/code> ou <code>Inertia<\/code>. Voc\u00ea pode passar a op\u00e7\u00e3o <code>--teams<\/code>\u00a0para habilitar o recurso de equipes.<\/p>\n<p>Isto tamb\u00e9m ir\u00e1 instalar o 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> para testes.<\/p>\n<p>E, finalmente, teremos que renderizar o frontend do nosso aplicativo usando o seguinte:<\/p>\n<pre><code class=\"language-php\">npm install\nnpm run dev<\/code><\/pre>\n<h2>Laravel Fortify<\/h2>\n<p>Laravel Fortify \u00e9 uma implementa\u00e7\u00e3o de autentica\u00e7\u00e3o de backend que \u00e9 agn\u00f3stica de frontend. Voc\u00ea n\u00e3o precisa usar o Laravel Fortify para implementar funcionalidades de autentica\u00e7\u00e3o do Laravel.<\/p>\n<p>Tamb\u00e9m \u00e9 usado em kits iniciantes como Breeze e Jetstream. Voc\u00ea tamb\u00e9m pode usar o Fortify de forma independente, que \u00e9 apenas uma implementa\u00e7\u00e3o de backend. Se voc\u00ea usar de forma independente, seu frontend deve chamar as rotas do Fortify.<\/p>\n<h3>Instala\u00e7\u00e3o e configura\u00e7\u00e3o<\/h3>\n<p>Podemos instalar o Fortify atrav\u00e9s do Composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/fortify<\/code><\/pre>\n<p>Agora temos que publicar os recursos do Fortify:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish --provider=\"Laravel\\Fortify\\FortifyServiceProvider\"<\/code><\/pre>\n<p>Depois disso, criaremos um novo diret\u00f3rio <strong>app\/Actions<\/strong> al\u00e9m do novo <strong>FortifyServiceProvider<\/strong>, arquivo de configura\u00e7\u00e3o e migra\u00e7\u00f5es do banco de dados.<\/p>\n<p>Finalmente, execute:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate<\/code><\/pre>\n<p>Ou:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh<\/code><\/pre>\n<p>E seu Fortify est\u00e1 pronto para usar.<\/p>\n<h2>Laravel Socialite<\/h2>\n<p>Laravel inclui um recurso simples de autentica\u00e7\u00e3o de usu\u00e1rio baseado em OAuth. Ele suporta logins sociais via Facebook, <a href=\"https:\/\/kinsta.com\/pt\/blog\/estatisticas-e-fatos-do-twitter\/\">Twitter<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/estatisticas-e-fatos-do-linkedin\/\">LinkedIn<\/a>, Google, <a href=\"https:\/\/kinsta.com\/pt\/blog\/git-para-desenvolvimento-web\/\">Bitbucket, GitHub, e GitLab<\/a>.<\/p>\n<h3>Instala\u00e7\u00e3o<\/h3>\n<p>Podemos instal\u00e1-lo atrav\u00e9s do Composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/socialite<\/code><\/pre>\n<h3>Configura\u00e7\u00e3o e uso<\/h3>\n<p>Ap\u00f3s instal\u00e1-lo, temos que adicionar as credenciais para o provedor OAuth que nosso aplicativo utiliza. Adicionaremos em <strong>config\/services.php<\/strong> para cada servi\u00e7o.<\/p>\n<p>Na configura\u00e7\u00e3o, devemos combinar a chave com os servi\u00e7os anteriores. Algumas dessas chaves incluem:<\/p>\n<ul>\n<li>facebook<\/li>\n<li>twitter (Para OAuth 1.0)<\/li>\n<li>twitter-oauth-2 (Para o 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>Uma configura\u00e7\u00e3o de servi\u00e7o pode se parecer com isso:<\/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>Autentica\u00e7\u00e3o de usu\u00e1rios<\/h3>\n<p>Para esta a\u00e7\u00e3o, precisaremos de duas rotas, uma para redirecionar o usu\u00e1rio para o provedor OAuth:<\/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>E uma para o callback do provedor ap\u00f3s a autentica\u00e7\u00e3o:<\/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 fornece o m\u00e9todo redirect, e a facade redireciona o usu\u00e1rio para o provedor OAuth. Enquanto isso, o m\u00e9todo user examina o request recebido e recupera as informa\u00e7\u00f5es do usu\u00e1rio.<\/p>\n<p>Ap\u00f3s obter nosso usu\u00e1rio, temos que verificar se ele existe em nosso banco de dados e autentic\u00e1-lo. Se n\u00e3o existir, criaremos um novo registro para representar o usu\u00e1rio:<\/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>Se quisermos limitar o escopo de acesso do usu\u00e1rio, podemos usar o m\u00e9todo <code>scopes<\/code>, que incluiremos com o pedido de autentica\u00e7\u00e3o. Isso mesclar\u00e1 todos os escopos previamente especificados com os escopos especificados.<\/p>\n<p>Uma alternativa \u00e9 usar o m\u00e9todo <code>setScopes<\/code> que sobrescreve todos os outros escopos existentes:<\/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>Agora que sabemos tudo e como conseguir um usu\u00e1rio ap\u00f3s o callback, vamos olhar alguns dos dados que podemos obter a partir dele.<\/p>\n<p>OAuth1 Utilizador tem <code>token<\/code> e <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 fornece <code>token<\/code>, <code>refreshToken<\/code>, e <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>Tanto OAuth1 como OAuth2 fornecem <code>getId<\/code>, <code>getNickname<\/code>, <code>getName<\/code>, <code>getEmail<\/code>, e <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>E se quisermos obter detalhes de um token (OAuth 2) ou de um token e segredo (OAuth 1), o Socialite fornece dois m\u00e9todos para isso: <code>userFromToken<\/code> e <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 \u00e9 um sistema de autentica\u00e7\u00e3o leve para SPAs (Single Page Applications) e aplicativos m\u00f3veis. Ele permite que os usu\u00e1rios gerem m\u00faltiplos tokens de API com escopos espec\u00edficos.<\/p>\n<h3>Uso<\/h3>\n<p>Sanctum pode ser usado para emitir tokens de API para o usu\u00e1rio sem as complexidades do OAuth. Esses tokens geralmente t\u00eam longos tempos de expira\u00e7\u00e3o, mas podem ser revogados e regenerados pelo usu\u00e1rio a qualquer momento.<\/p>\n<h3>Instala\u00e7\u00e3o e configura\u00e7\u00e3o<\/h3>\n<p>Podemos instal\u00e1-lo via Composer:<\/p>\n<pre><code class=\"language-php\">composer require laravel\/sanctum<\/code><\/pre>\n<p>Depois, precisamos publicar os arquivos de configura\u00e7\u00e3o e migra\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-bash\">php artisan vendor:publish --provider=\"Laravel\\Sanctum\\SanctumServiceProvider\"<\/code><\/pre>\n<p>Ap\u00f3s gerar novos arquivos de migra\u00e7\u00e3o, execute:<\/p>\n<pre><code class=\"language-bash\">php artisan migrate:fresh<\/code><\/pre>\n<h3>Como emitir Tokens API<\/h3>\n<p>Antes de emitir tokens, nosso modelo de usu\u00e1rio deve usar o trait <strong>LaravelSanctumHasApiTokens<\/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>Quando temos o usu\u00e1rio, podemos emitir um token chamando o m\u00e9todo <code>createToken<\/code>, que retorna uma inst\u00e2ncia de <strong>LaravelSanctumNewAccessToken<\/strong>.<\/p>\n<p>Podemos chamar o m\u00e9todo <code>plainTextToken<\/code> na inst\u00e2ncia <strong>NewAccessToken<\/strong> para ver o valor em texto simples <strong>SHA-256<\/strong> do token.<\/p>\n<h2>Dicas e melhores pr\u00e1ticas para autentica\u00e7\u00e3o no Laravel<\/h2>\n<h3>Invalida\u00e7\u00e3o de sess\u00f5es em outros dispositivos<\/h3>\n<p>Como discutimos anteriormente, invalidar a sess\u00e3o \u00e9 crucial quando o usu\u00e1rio faz logout, mas isso tamb\u00e9m deve estar dispon\u00edvel como uma op\u00e7\u00e3o para todos os dispositivos que ele possui.<\/p>\n<p>Essa funcionalidade \u00e9 geralmente usada quando o usu\u00e1rio muda ou atualiza sua senha e queremos invalidar sua sess\u00e3o em qualquer outro dispositivo.<\/p>\n<p>Fornecido com a <em>facade<\/em> Auth, isso \u00e9 f\u00e1cil de ser feito. Considerando que a rota que estamos usando tem <code>auth.session middleware<\/code>, podemos usar o m\u00e9todo est\u00e1tico <code>logoutOtherDevices<\/code> da <em>facade<\/em>:<\/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>Configura\u00e7\u00e3o com Auth::routes()<\/h3>\n<p>O m\u00e9todo de rotas do Auth facade \u00e9 apenas um auxiliar para gerar todas as rotas necess\u00e1rias para a autentica\u00e7\u00e3o do usu\u00e1rio.<\/p>\n<p>As rotas incluem Login (Get, Post), Logout (Post), Register (Get, Post) e Password Reset\/Email (Get, Post).<\/p>\n<p>Quando voc\u00ea chama o m\u00e9todo facade, ele faz o seguinte:<\/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>Estamos interessados no que acontece quando o m\u00e9todo est\u00e1tico \u00e9 chamado no roteador. Isso pode ser complicado devido \u00e0 forma como facades funcionam, mas o m\u00e9todo seguinte chamado \u00e9 assim:<\/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>Por padr\u00e3o, ele gera todas as rotas, exceto a de verifica\u00e7\u00e3o de e-mail. Sempre teremos as rotas de Login e Logout, mas as outras podemos controlar atrav\u00e9s do array de op\u00e7\u00f5es.<\/p>\n<p>Se quisermos ter apenas login\/logout e registro, podemos passar o seguinte array de op\u00e7\u00f5es:<\/p>\n<pre><code class=\"language-php\">$options = [\"register\" =&gt; true, \"reset\" =&gt; false, \"verify\" =&gt; false];<\/code><\/pre>\n<h3>Protegendo rotas e guards personalizados<\/h3>\n<p>Queremos garantir que algumas rotas s\u00f3 possam ser acessadas por usu\u00e1rios autenticados e isso pode ser feito rapidamente adicionando uma chamada ao m\u00e9todo middleware na facade Route ou encadeando o m\u00e9todo middleware nela:<\/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>Esse guardi\u00e3o garante que as solicita\u00e7\u00f5es recebidas sejam autenticadas.<\/p>\n<h3>Confirma\u00e7\u00e3o de senha<\/h3>\n<p>Para maior <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\">seguran\u00e7a adicional do site<\/a>, muitas vezes voc\u00ea deseja confirmar a senha de um usu\u00e1rio antes de prosseguir com qualquer outra tarefa.<\/p>\n<p>Devemos definir uma rota a partir da vis\u00e3o de confirma\u00e7\u00e3o de senha para lidar com a solicita\u00e7\u00e3o. Ela ir\u00e1 validar e redirecionar o usu\u00e1rio para seu destino pretendido. Ao mesmo tempo, garantiremos que nossa senha apare\u00e7a confirmada na sess\u00e3o. Por padr\u00e3o, a senha precisa ser reconfirmada a cada tr\u00eas horas, mas isso pode ser alterado no arquivo de configura\u00e7\u00e3o em <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>Contrato aut\u00eantico<\/h3>\n<p>O contrato Aut\u00eantico localizado em IlluminateContracts Auth define um modelo do que a facade UserProvider deve implementar:<\/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>A interface permite que o sistema de autentica\u00e7\u00e3o funcione com qualquer classe &#8220;usu\u00e1rio&#8221; que a implemente.<\/p>\n<p>Isso vale independentemente de qual ORM ou camadas de armazenamento s\u00e3o usadas. Por padr\u00e3o, o Laravel tem o App\\Models\\User que implementa essa interface, e isso tamb\u00e9m pode ser visto no arquivo de configura\u00e7\u00e3o:<\/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>Eventos de autentica\u00e7\u00e3o<\/h3>\n<p>H\u00e1 v\u00e1rios eventos que s\u00e3o disparados durante todo o processo de autentica\u00e7\u00e3o.<\/p>\n<p>Dependendo dos seus objetivos, voc\u00ea pode anexar ouvintes a esses eventos no seu <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=\"Uma lista de ouvintes do Laravel gerados para o nosso servi\u00e7o de autentica\u00e7\u00e3o\" width=\"1003\" height=\"1999\"><figcaption class=\"wp-caption-text\">Uma lista de ouvintes do Laravel gerados para o nosso servi\u00e7o de autentica\u00e7\u00e3o<\/figcaption><\/figure>\n<h3>Crie novos usu\u00e1rios rapidamente<\/h3>\n<p>A cria\u00e7\u00e3o de um novo usu\u00e1rio pode ser feita rapidamente atrav\u00e9s do <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>Ou atrav\u00e9s do m\u00e9todo de criar est\u00e1tica na facade do usu\u00e1rio:<\/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>Resumo<\/h2>\n<p>O ecossistema Laravel possui muitos kits de inicia\u00e7\u00e3o para colocar seu aplicativo em funcionamento com um sistema de autentica\u00e7\u00e3o, como o Breeze e o Jetstream. Eles s\u00e3o altamente personaliz\u00e1veis, pois o c\u00f3digo \u00e9 gerado do nosso lado, e podemos modific\u00e1-lo o quanto quisermos, usando como um modelo, se necess\u00e1rio.<\/p>\n<p>H\u00e1 muitas preocupa\u00e7\u00f5es de seguran\u00e7a em rela\u00e7\u00e3o \u00e0 autentica\u00e7\u00e3o e suas complexidades, mas todas elas podem ser facilmente resolvidas atrav\u00e9s das ferramentas que o Laravel oferece. Essas ferramentas s\u00e3o altamente personaliz\u00e1veis e f\u00e1ceis de usar.<\/p>\n<p>Implante seus aplicativos Laravel de forma r\u00e1pida e eficiente com o nosso servi\u00e7o de hospedagem Laravel. Veja seu aplicativo em a\u00e7\u00e3o com um <a href=\"https:\/\/kinsta.com\/pt\/inscreva-se\/?product_type=app-db\">teste gratuito<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A autentica\u00e7\u00e3o \u00e9 uma das caracter\u00edsticas mais cr\u00edticas e essenciais dos aplicativos web. Frameworks web como o Laravel oferecem diversas maneiras para os usu\u00e1rios se autenticarem. &#8230;<\/p>\n","protected":false},"author":267,"featured_media":58545,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[984],"class_list":["post-58544","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>Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.\" \/>\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\/pt\/blog\/autenticacao-laravel\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel\" \/>\n<meta property=\"og:description\" content=\"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-20T13:42:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-01T15:52:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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=\"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel\",\"datePublished\":\"2023-08-20T13:42:56+00:00\",\"dateModified\":\"2025-09-01T15:52:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/\"},\"wordCount\":3378,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/\",\"name\":\"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg\",\"datePublished\":\"2023-08-20T13:42:56+00:00\",\"dateModified\":\"2025-09-01T15:52:17+00:00\",\"description\":\"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel - Kinsta\u00ae","description":"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.","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\/pt\/blog\/autenticacao-laravel\/","og_locale":"pt_PT","og_type":"article","og_title":"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel","og_description":"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.","og_url":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2023-08-20T13:42:56+00:00","article_modified_time":"2025-09-01T15:52:17+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Coman Cosmin","Tempo estimado de leitura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel","datePublished":"2023-08-20T13:42:56+00:00","dateModified":"2025-09-01T15:52:17+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/"},"wordCount":3378,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/","url":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/","name":"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg","datePublished":"2023-08-20T13:42:56+00:00","dateModified":"2025-09-01T15:52:17+00:00","description":"Aumente o n\u00edvel de seguran\u00e7a do seu aplicativo web com a autentica\u00e7\u00e3o no Laravel. Comece a usar as pr\u00e1ticas recomendadas de seguran\u00e7a e aprenda a conceder acesso seguro.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/03\/laravel-queue.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/autenticacao-laravel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/pt\/topicos\/laravel\/"},{"@type":"ListItem","position":3,"name":"Um Guia Abrangente de Autentica\u00e7\u00e3o no Laravel"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/58544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=58544"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/58544\/revisions"}],"predecessor-version":[{"id":72726,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/58544\/revisions\/72726"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/translations\/dk"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/58544\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/58545"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=58544"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=58544"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=58544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}