Custom email verification in laravel 8, 9; In this tutorial, you will learn how to create custom email verification system in laravel application.
Laravel 9 Custom Email Verification with Activation Code Tutorial Example
Use the following steps to create custom email verification system in laravel 8, 9 applications:
- Step 1: Create “users_verify” table using Migration
- Step 2: Create Update Model
- Step 3: Create Route
- Step 4: Update Auth Controller
- Step 5: Create Blade File
- Step 6: Create Middleware
- Step 7: Email Configuration
- Step 8: Start Development Server
Step 1: Create “users_verify” table using Migration
Execute the following command on your terminal to create users_verify table into your database using laravel migration:
php artisan make:model UserVerify -m
Then visit the database/migration directory and open create_users_verify_table.php file and add the following code into your file; as shown below:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class UsersVerify extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users_verify', function (Blueprint $table) { $table->integer('user_id'); $table->string('token'); $table->timestamps(); }); Schema::table('users', function (Blueprint $table) { $table->boolean('is_email_verified')->default(0); }); } /** * Reverse the migrations. * * @return void */ public function down() { } }
Step 2: Update Model
Now open these two user.php and UserVerify.php models files. Then update the following code into these files; as shown below:
Update the following code into app/Models/User.php file; as shown below:
<?php namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use HasFactory, Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', 'is_email_verified' ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; }
Next, Update the following code into app/Models/UserVerify.php file; as shown below:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class UserVerify extends Model { use HasFactory; public $table = "users_verify"; /** * Write code on Method * * @return response() */ protected $fillable = [ 'user_id', 'token', ]; /** * Write code on Method * * @return response() */ public function user() { return $this->belongsTo(User::class); } }
Step 3: Create Route
Visit routes directory and open web.php file and create a custom route for email verification; as shown below:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\Auth\AuthController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('login', [AuthController::class, 'index'])->name('login'); Route::post('post-login', [AuthController::class, 'postLogin'])->name('login.post'); Route::get('registration', [AuthController::class, 'registration'])->name('register'); Route::post('post-registration', [AuthController::class, 'postRegistration'])->name('register.post'); Route::get('logout', [AuthController::class, 'logout'])->name('logout'); /* New Added Routes */ Route::get('dashboard', [AuthController::class, 'dashboard'])->middleware(['auth', 'is_verify_email']); Route::get('account/verify/{token}', [AuthController::class, 'verifyAccount'])->name('user.verify');
Step 4: Update Auth Controller
Visit app/Http/Controllers/Auth/ directory and open your auth controller (in our controller name is AuthController.php) file and update the following methods into it:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Session; use App\Models\User; use App\Models\UserVerify; use Hash; use Illuminate\Support\Str; use Mail; class AuthController extends Controller { /** * Write code on Method * * @return response() */ public function index() { return view('auth.login'); } /** * Write code on Method * * @return response() */ public function registration() { return view('auth.registration'); } /** * Write code on Method * * @return response() */ public function postLogin(Request $request) { $request->validate([ 'email' => 'required', 'password' => 'required', ]); $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials)) { return redirect()->intended('dashboard') ->withSuccess('You have Successfully loggedin'); } return redirect("login")->withSuccess('Oppes! You have entered invalid credentials'); } /** * Write code on Method * * @return response() */ public function postRegistration(Request $request) { $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|min:6', ]); $data = $request->all(); $createUser = $this->create($data); $token = Str::random(64); UserVerify::create([ 'user_id' => $createUser->id, 'token' => $token ]); Mail::send('email.emailVerificationEmail', ['token' => $token], function($message) use($request){ $message->to($request->email); $message->subject('Email Verification Mail'); }); return redirect("dashboard")->withSuccess('Great! You have Successfully loggedin'); } /** * Write code on Method * * @return response() */ public function dashboard() { if(Auth::check()){ return view('dashboard'); } return redirect("login")->withSuccess('Opps! You do not have access'); } /** * Write code on Method * * @return response() */ public function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']) ]); } /** * Write code on Method * * @return response() */ public function logout() { Session::flush(); Auth::logout(); return Redirect('login'); } /** * Write code on Method * * @return response() */ public function verifyAccount($token) { $verifyUser = UserVerify::where('token', $token)->first(); $message = 'Sorry your email cannot be identified.'; if(!is_null($verifyUser) ){ $user = $verifyUser->user; if(!$user->is_email_verified) { $verifyUser->user->is_email_verified = 1; $verifyUser->user->save(); $message = "Your e-mail is verified. You can now login."; } else { $message = "Your e-mail is already verified. You can now login."; } } return redirect()->route('login')->with('message', $message); } }
Step 5: Create Blade File
Visit resources/views/emails/ directory and create emailVerificationEmail.blade.php file. Then update the following code into it;
<h1>Email Verification Mail</h1> Please verify your email with bellow link: <a href="{{ route('user.verify', $token) }}">Verify Email</a>
Step 6: Create Middleware
Execute the following command into your terminal to create middleware file:
php artisan make:middleware IsVerifyEmail
Then visit app/Http/Middleware/ directory and open IsVerifyEmail.php file; as shown below:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class IsVerifyEmail { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) { if (!Auth::user()->is_email_verified) { auth()->logout(); return redirect()->route('login') ->with('message', 'You need to confirm your account. We have sent you an activation code, please check your email.'); } return $next($request); } }
Then register middleware in kernal.php file; so visit app/Http/ directory and open Kernel.php file and update the following code into it:
protected $routeMiddleware = [ .... 'is_verify_email' => \App\Http\Middleware\IsVerifyEmail::class, ];
Step 7: Email Configuration
Update email configuration details; so open your .env file and update email configuration details; as shown below:
MAIL_DRIVER=smtp MAIL_HOST=smtp-mail.outlook.com MAIL_PORT=587 [email protected] MAIL_PASSWORD=123456789 MAIL_ENCRYPTION=tls [email protected]
Step 8: Start Development Server
Execute the following command on terminal to start development server:
php artisan serve
Then open your browser and hit the following url into it:
localhost:8000/register