Custom Login / Registration , forget Password in Laravel
1. Goto mail trap make account and config your laravel app. https://mailtrap.io/
2. Make authentication controller
php artisan make:model Authentication--controller //model with controller
3. Make login, register and do login, do register, logout routes
Route::controller(\App\Http\Controllers\AuthenticationController::class)->group(function () {
Route::get('login','index')->name('login');
Route::get('register','register')->name('register');
Route::post('do_login','do_login')->name('do_login');
Route::post('do_register','do_register')->name('do_register');
Route::get('logout', 'logout')->name('logout');
});
4. CREATE VIEWS
>>auth>login.blade.php
@if(session()->has('status'))
{{session('status')}}
@elseif(session()->has('success'))
{{session('success')}}
@endif
>>auth>>register.blade.php
@if ($errors->any())
@foreach ($errors->all() as $error)
{{ $error }}
@endforeach
@endif
>>auth>>reset.blade.php
auth>>forgot-password.blade.php
5. AuthenticationController.php
<?php
namespace App\Http\Controllers;
use Hash;
use Session;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
class AuthenticationController extends Controller
{
public function index(){
return view("auth.login");
}
public function do_login(Request $request){
$request->validate([
'email' => 'required',
'password' => 'required',
]);
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
return redirect()->intended('home')
->with('success','Signed in');
}
return redirect("login")->with('status','Login details are not valid');
}
public function register(){
//do_register
return view("auth.register");
}
public function do_register(Request $request){
//do_register
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:6'
]);
$user = \App\Models\User::create([
'name' => $request->name,
'email'=>$request->email,
'password'=> Hash::make($request->password)
]);
Auth::login($user);
return redirect("home")->withSuccess('You have signed-in');
}
public function logout() {
Session::flush();
Auth::logout();
return Redirect('login');
}
}
FOR RESET
1. ADD THIS LINE INTO USER MODEL, CanResetPassword;
Illuminate\Auth\Passwords\CanResetPassword;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable,CanResetPassword;
.....
}
add in routing web.php, you must provide default route names to make it working else error thrown
use Illuminate\Support\Facades\Route;
Route::controller(\App\Http\Controllers\AuthenticationController::class)->group(function () {
/*********** RESET ***************/
Route::get('forgot-password', 'forgot_password')->middleware('guest')->name('password.request');
Route::post('forgot_password_init', 'forgot_password_init')->middleware('guest');
Route::get('/reset-password/{token}', 'reset_password')->middleware('guest')->name('password.reset');
Route::post('/reset_password_init', 'reset_password_init')->middleware('guest');
});
In controller Logic.
<?php
namespace App\Http\Controllers;
use Hash;
use Session;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Support\Str;
class AuthenticationController extends Controller
{
/*************** FORGET PASSWORD **************/
public function forgot_password(){
return view("auth.forgot-password");
}
public function forgot_password_init(Request $request){
$request->validate(['email' => 'required|email']);
$status = Password::sendResetLink(
$request->only('email')
);
return $status === Password::RESET_LINK_SENT
? back()->with('success',"link sent to your email")
: back()->with('status', "Email not found");
}
public function reset_password($token){
return view('auth.reset-password', ['token' => $token]);
}
public function reset_password_init(Request $request){
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => 'required|confirmed',
]);
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user, $password) {
$user->forceFill([
'password' => Hash::make($password)
])->setRememberToken(Str::random(60));
$user->save();
event(new PasswordReset($user));
}
);
return $status === Password::PASSWORD_RESET
? redirect()->route('login')->with('success', "Password Updated Successfully")
: back()->with('status', "Not changed try again");
}
}