Implement Forgot Password and Reset Password functionality using Laravel Passport

This commit is contained in:
Nima8FT 2025-04-17 14:35:53 +03:30
parent a65a7ecf36
commit 142afd5fb1
5 changed files with 152 additions and 1 deletions

View File

@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers\API\Auth\Password;
use App\Models\User;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Auth\Events\PasswordReset;
use App\Http\Requests\ResetPasswordRequest;
class ResetPasswordController extends Controller
{
public function resetPassword(ResetPasswordRequest $request)
{
try {
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function (User $user, string $password) {
$user->forceFill([
'password' => Hash::make($password)
])->setRememberToken(Str::random(60));
$user->save();
event(new PasswordReset($user));
}
);
if ($status === Password::PasswordReset) {
return response()->json([
'status' => 1,
'message' => 'Your password has been reset!'
]);
} else {
return response()->json([
'status' => 1,
'message' => 'This password reset token is invalid.'
]);
}
} catch (\Exception $e) {
return response()->json([
'status' => 0,
'error' => 'We couldnt process the request due to an error. Please try again later.',
'message' => $e->getMessage(),
], 500);
}
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers\API\Auth\Password;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Password;
use App\Http\Requests\PasswordNotificationRequest;
class SendPasswordNotificationController extends Controller
{
public function passwordNotification(PasswordNotificationRequest $request)
{
try {
$status = Password::sendResetLink(
$request->only('email')
);
if ($status === Password::ResetLinkSent) {
return response()->json([
'status' => 1,
'message' => "Weve emailed you the password reset link. Please check your inbox!",
], 200);
} else {
return response()->json([
'status' => 0,
'message' => "We cant find a user with that email address.",
], 200);
}
} catch (\Exception $e) {
return response()->json([
'status' => 0,
'error' => 'We couldnt send the password reset email due to an error. Please try again later.',
'message' => $e->getMessage(),
], 500);
}
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PasswordNotificationRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
"email" => "required|email|exists:users,email",
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ResetPasswordRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'token' => 'required',
'email' => 'required|email|exists:users,email',
'password' => 'required|min:8|confirmed',
];
}
}

View File

@ -7,7 +7,9 @@ use App\Http\Controllers\API\Auth\LogoutController;
use App\Http\Controllers\API\Auth\RegisterController;
use App\Http\Controllers\API\Auth\DeleteAccountController;
use App\Http\Controllers\API\Auth\Mail\VerifyMailController;
use App\Http\Controllers\API\Auth\Password\ResetPasswordController;
use App\Http\Controllers\API\Auth\Mail\SendMailNotificationController;
use App\Http\Controllers\API\Auth\Password\SendPasswordNotificationController;
Route::get('/user', function (Request $request) {
return $request->user();
@ -22,5 +24,11 @@ Route::group(['middleware' => ['auth:api']], function () {
//verified email route
Route::post('email/verification-notification', [SendMailNotificationController::class, 'sendNotification'])->name('mail.notification');
Route::post('/email/verify/{id}/{hash}', [VerifyMailController::class, 'verifyMail'])->name('verification.verify');
Route::post('email/verify/{id}/{hash}', [VerifyMailController::class, 'verifyMail'])->name('verification.verify');
});
//route for forgot password
Route::group(['middleware' => ['guest']], function () {
Route::post('forgot-password', [SendPasswordNotificationController::class, 'passwordNotification'])->name('password.notification');
Route::post('reset-password', [ResetPasswordController::class, 'resetPassword'])->name('password.reset');
});