Verificação por e-mail
Introdução
Muitos aplicativos da web exigem que os usuários verifiquem seus endereços de e-mail antes de usar o aplicativo. Em vez de forçá-lo a reimplementar esse recurso manualmente para cada aplicativo que você cria, o Laravel fornece serviços convenientes incorporados para enviar e verificar solicitações de verificação de e-mail.
NOTA
Quer começar rápido? Instale um dos Kit de Início Laravel em um novo aplicativo Laravel. Os kits de início cuidarão do seu sistema completo de autenticação, incluindo suporte para verificação por e-mail.
Preparação do Modelo
Antes de começar, verifique se o seu modelo App\Models\User
implementa o contrato 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;
// ...
}
Uma vez que esta interface tenha sido adicionada ao seu modelo, os novos usuários registrados serão automaticamente enviados um e-mail contendo um link de verificação de conta. Isso acontece sem problemas porque o Laravel registra automaticamente o Illuminate\Auth\Listeners\SendEmailVerificationNotification
ouvinte para o evento Illuminate\Auth\Events\Registered
.
Se você está implementando manualmente a inscrição dentro do seu aplicativo em vez de usar um Kit de Início, você deve garantir que o evento Illuminate\Auth\Events\Registered
é enviado após uma inscrição bem sucedida.
use Illuminate\Auth\Events\Registered;
event(new Registered($user));
Preparação do banco de dados
Em seguida, sua tabela de usuários deve conter uma coluna de e-mail verificada em que você armazena a data e hora que o endereço de e-mail do usuário foi verificado. Geralmente isso está incluído na migração padrão do banco de dados 0001_01_01_000000_create_users_table.php
do Laravel
Rotas
Para implementar adequadamente a verificação de e-mail, três rotas serão necessárias. Primeiro, uma rota será necessária para exibir uma notificação ao usuário que ele deve clicar no link de verificação de e-mail no e-mail enviado pelo Laravel após o registro.
Em segundo lugar, uma rota será necessária para lidar com as requisições geradas quando o usuário clicar no link de verificação de e-mail no e-mail.
Terceiro, uma rota será necessária para reenviar um link de verificação se o usuário acidentalmente perder o primeiro link de verificação.
Notificação de verificação de e-mail
Como mencionado anteriormente, uma rota deve ser definida que retornará uma visão instruindo o usuário a clicar no link de verificação de e-mail enviado pelo Laravel após o registro. Esta visão será exibida aos usuários quando eles tentarem acessar outras partes do aplicativo sem verificar primeiro seu endereço de e-mail. Lembre-se, o link é automaticamente enviado para o 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 de e-mail deve ser nomeada verification.notice
. É importante que a rota receba esse nome exato, pois o middleware verified
incluído com o Laravel redirecionará automaticamente para esse nome de rota se um usuário não tiver verificado seu endereço de e-mail.
NOTA
Ao implementar manualmente a verificação de e-mail, você é obrigado a definir o conteúdo da visualização do aviso de verificação de conta por si mesmo. Se você gostaria de um modelo pré-definido com todas as visualizações necessárias para autenticação e verificação de contas, verifique os kits iniciais de aplicativos Laravel.
O manipulador de verificação de e-mail
Em seguida, precisamos definir uma rota que irá lidar com as solicitações geradas quando o usuário clicar no link de verificação por e-mail enviado a ele. Esta rota deve ser chamada verification.verify
e deve ter os middlewares auth
e signed
:
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');
Antes de prosseguir, vamos examinar mais de perto essa rota. Primeiro, você perceberá que estamos usando um tipo de solicitação EmailVerificationRequest
em vez do tipo de solicitação padrão Illuminate\Http\Request
. O EmailVerificationRequest
é um tipo de solicitação de formulário incluído no Laravel. Esta solicitação cuidará automaticamente da validação dos parâmetros id
e hash
da solicitação.
Em seguida, podemos prosseguir diretamente para chamar o método fulfill
na solicitação. Este método chamará markEmailAsVerified
no usuário autenticado e enviará o evento Illuminate\Auth\Events\Verified
. O método markEmailAsVerified
está disponível no modelo padrão App\Models\User
via a classe base Illuminate\Foundation\Auth\User
. Uma vez que o endereço de e-mail do usuário tenha sido verificado, você pode redirecioná-lo para onde quiser.
Enviando o email de verificação novamente
Às vezes um usuário pode confundir ou acidentalmente excluir o e-mail de verificação de endereço. Para resolver isso, você pode definir uma rota para permitir que o usuário solicite que o e-mail de verificação seja re-enviado. Em seguida, você pode fazer um pedido dessa rota colocando um botão simples de envio de formulário dentro da verificação de notificação por e-mail:
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 Rotas
O middleware Route middleware pode ser utilizado para permitir somente usuários verificados ao acessar um determinado recurso. O Laravel inclui um alias chamado verified
do middleware middleware alias, que é uma abreviação da classe middleware Illuminate\Auth\Middleware\EnsureEmailIsVerified
. Como o Laravel já registra automaticamente este alias, tudo o que você precisa fazer é anexar o middleware verified
a uma definição de rota. Normalmente, esse middleware é associado ao middleware auth
:
Route::get('/profile', function () {
// Somente usuários verificados podem acessar esta rota...
})->middleware(['auth', 'verified']);
Se um usuário não verificado tenta acessar uma rota que tem sido atribuída a este middleware, ele será automaticamente redirecionado para a rota nomeada verification.notice
.
Personalização
Personalização da verificação por e-mail
Embora a notificação padrão de verificação por e-mail deva satisfazer as exigências da maioria dos aplicativos, o Laravel permite que você personalize como a mensagem do e-mail de verificação é construída.
Para começar, passe um closure para o método toMailUsing
fornecido pela classe Illuminate\Auth\Notifications\VerifyEmail
da notificação. O closure receberá a instância do modelo que está recebendo a notificação, assim como a URL de verificação de e-mail com assinatura que o usuário deve visitar para verificar seu endereço de e-mail. O closure deve retornar uma instância de Illuminate\Notifications\Messages\MailMessage
. Normalmente, você chama o método toMailUsing
do método boot
da classe AppServiceProvider
do seu aplicativo:
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Inicialize qualquer serviço de aplicativo.
*/
public function boot(): void
{
// ...
VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}
NOTA
Para aprender mais sobre notificações por e-mail, consulte a documentação de notificações pelo e-mail.
Eventos
Ao usar o Laravel Starter Kits, o Laravel envia um evento Illuminate\Auth\Events\Verified
durante o processo de verificação de e-mail. Se você estiver lidando manualmente com a verificação de e-mail para sua aplicação, poderá enviar manualmente esses eventos após a conclusão da verificação.