Este Artigo é basicamente uma tradução da documentação oficial do laravel: https://laravel.com/docs/9.x/verification
Sumário
- Introdução
- Preparando o Model
- Preparando o Banco de Dados
- Rotas (Routing)
- Rota para notificar o usuário
- Rota de confirmação de e-mail
- Rota para reenvio do e-mail de confirmação
- Protegendo as rotas
- Personalizando o E-mail de confirmação
- Configurando eventos manualmente
Introdução
A maioria dos apps e sistemas hoje em dia exigem que os usuarios cadastrados confirmem o e-mail para ter uma informação válidada.
O Laravel já tem essa função implementada nativamente em seu codigo, fazendo a configuração que este artigo descreve você vai conseguir enviar e-mails de validação para os usuários novos, válidar os e-mails através dos links enviados e reenviar e-mails de válidação caso necessário.
Tudo isso com segurança e muito simples de configurar.
Você já instalou o Starter Kit? O Starter Kit do laravel é responsavel por implementar toda autentificação de usuários, incluindo a válidação de e-mails que este artigo descreve.
Faça isso antes de seguir com este tutorial.
Preparando o Model
O priemiro passo é verificar se o model de usuários – App\Models\User
– está com a está implementando a verificação de e-mails – Illuminate\Contracts\Auth\MustVerifyEmail
:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}
Caso a linha -> “use Illuminate\Contracts\Auth\MustVerifyEmail;” não exista, insira ela como no código demonstrado acima, ou caso ela esteja comentada remova o comentário.
E não esqueça de verificar se na linha que está definindo a classe acima está finalizando com “implements MustVerifyEmail”.
Feito isto, os novos usuários registrados apartir de agora já receberão um e-mail com o link de verificação. Conforme você pode ver em App\Providers\EventServiceProvider
, que o Laravel já contem o SendEmailVerificationNotification
sendo chamado pelo evento Illuminate\Auth\Events\Registered
.
Caso você esteja implementando a verificação de e-mail de forma completamente manual, sem estar usando o Starter Kit, tenha certeza de que você está disparando o Illuminate\Auth\Events\Registered
após os registros de usuário, da seguinte forma:
use Illuminate\Auth\Events\Registered;
event(new Registered($user));
Preparando o Banco de Dados
Sua tabela de “users” no banco de dados deve conter a coluna “email_verified_at” para armazenar a data e hora em que o endereço de e-mail do usuário foi verificado.
Por padrão, o Laravel já incluí este campo na tabela de usuários. Você apenas precisar rodar as migrations:
php artisan migrate
Rotas (Routing)
Para implementar a verificação de e-mails são necessárias 3 rotas:
- A primeira rota é responsável por exibir um aviso ao usuário de que ele deve clicar no link de verificação de e-mai enviado para ele
- A segunda rota faz a verificação do email quando o usuário acessar o link enviado para ele
- A terceira rota faz o reenvio do e-mail de verificação com o link quando o usuário solicitar.
Rota para notificar o usuário
Deve ser definida uma rota que retornará uma view avisando o usuário que ele precisa confirmar o e-mail clicando no link que foi enviado para ele via E-mail.
Essa visualização será exibida para os usuários quando eles tentarem acessar alguma parte do sistema que precise do e-mail válidado.
Lembre-se de que o link é enviado automaticamente por e-mail ao usuário, desde que seu modelo App\Models\User implemente a interface MustVerifyEmail.
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
A rota que retorna o aviso de verificação por e-mail deve se chamar verification.notice.
É importante que a rota seja atribuída a esse nome, pois o middleware verificado incluído no Laravel será redirecionado automaticamente para esse nome de rota se um usuário não tiver verificado seu endereço de e-mail.
When manually implementing email verification, you are required to define the contents of the verification notice view yourself. If you would like scaffolding that includes all necessary authentication and verification views, check out the Laravel application starter kits.
Rota para reenvio do e-mail de confirmação
Next, we need to define a route that will handle requests generated when the user clicks the email verification link that was emailed to them. This route should be named verification.verify
and be assigned the auth
and signed
middlewares:
use Illuminate\Foundation\Auth\EmailVerificationRequest;
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');
Before moving on, let’s take a closer look at this route. First, you’ll notice we are using an EmailVerificationRequest
request type instead of the typical Illuminate\Http\Request
instance. The EmailVerificationRequest
is a form request that is included with Laravel. This request will automatically take care of validating the request’s id
and hash
parameters
Next, we can proceed directly to calling the fulfill
method on the request. This method will call the markEmailAsVerified
method on the authenticated user and dispatch the Illuminate\Auth\Events\Verified
event. The markEmailAsVerified
method is available to the default App\Models\User
model via the Illuminate\Foundation\Auth\User
base class. Once the user’s email address has been verified, you may redirect them wherever you wish.
Rota de confirmação de e-mail
Sometimes a user may misplace or accidentally delete the email address verification email. To accommodate this, you may wish to define a route to allow the user to request that the verification email be resent. You may then make a request to this route by placing a simple form submission button within your verification notice view:
use Illuminate\Http\Request;
Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();
return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');
Protegendo as rotas
Route middleware may be used to only allow verified users to access a given route. Laravel ships with a verified
middleware, which references the Illuminate\Auth\Middleware\EnsureEmailIsVerified
class. Since this middleware is already registered in your application’s HTTP kernel, all you need to do is attach the middleware to a route definition. Typically, this middleware is paired with the auth
middleware:
Route::get('/profile', function () {
// Only verified users may access this route...
})->middleware(['auth', 'verified']);
If an unverified user attempts to access a route that has been assigned this middleware, they will automatically be redirected to the verification.notice
named route.
Personalizando o E-mail de confirmação
Although the default email verification notification should satisfy the requirements of most applications, Laravel allows you to customize how the email verification mail message is constructed.
To get started, pass a closure to the toMailUsing
method provided by the Illuminate\Auth\Notifications\VerifyEmail
notification. The closure will receive the notifiable model instance that is receiving the notification as well as the signed email verification URL that the user must visit to verify their email address. The closure should return an instance of Illuminate\Notifications\Messages\MailMessage
. Typically, you should call the toMailUsing
method from the boot
method of your application’s App\Providers\AuthServiceProvider
class:
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
// ...
VerifyEmail::toMailUsing(function ($notifiable, $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}
To learn more about mail notifications, please consult the mail notification documentation.
Configurando eventos manualmente
When using the Laravel application starter kits, Laravel dispatches events during the email verification process. If you are manually handling email verification for your application, you may wish to manually dispatch these events after verification is completed. You may attach listeners to these events in your application’s EventServiceProvider
:
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Verified' => [
'App\Listeners\LogVerifiedUser',
],
];