Implement forgot password with JWT

This commit is contained in:
Nima8FT 2025-04-17 17:06:02 +03:30
parent b0972ab066
commit 9eb4503084
5 changed files with 151 additions and 0 deletions

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\NotificationPasswordRequest;
class NotificationPasswordController extends Controller
{
public function passwordNotification(NotificationPasswordRequest $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,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,28 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class NotificationPasswordRequest 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

@ -5,6 +5,8 @@ use App\Http\Controllers\API\Auth\LoginController;
use App\Http\Controllers\API\Auth\LogoutController;
use App\Http\Controllers\API\Auth\Mail\SendMailNotificationController;
use App\Http\Controllers\API\Auth\Mail\VerifyMailController;
use App\Http\Controllers\API\Auth\Password\NotificationPasswordController;
use App\Http\Controllers\API\Auth\Password\ResetPasswordController;
use App\Http\Controllers\API\Auth\RegisterController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
@ -24,3 +26,9 @@ Route::group(['middleware' => 'auth:api'], function () {
Route::post('/email/verification-notification', [SendMailNotificationController::class, 'mailNotification'])->name('mail.notification');
Route::get('/email/verify/{id}/{hash}', [VerifyMailController::class, 'verifyMail'])->name('verification.verify');
});
//reset password
Route::group(['middleware' => 'guest'], function () {
Route::post('forgot-password', [NotificationPasswordController::class, 'passwordNotification'])->name('password.notification');
Route::post('reset-password', [ResetPasswordController::class, 'resetPassword'])->name('password.reset');
});