سلام من از Passport برای پیاده سازی token و ... استفاده کردم
برای پیاده سازی فراموشی رمز عبور با استفاده از موبایل باید به چه روشی عمل کرد؟
از یک روشی استفاده کنید به عنوان مثال یک لینک تولید کنید که تاریخ انقضا داره و با اس ام اس ارسال کنید برای کاربر ...
یک جدول توی دیتابیس ایجاد کنید
یک url و یا کد فراموشی رمز رو توش ذخیره کنید
و بعد کاربر که کد رو برای api ارسال کرد با کتاب خونه carbon چک کنید تاریخش نگذشته باشه ...
و در آخر اگه همه چی اوکی بود اجازه آپدیت فیلد password رو بهش بدید
سلام محمد جان ممنون که پاسخ دادین
به دلیل اینکه ایمیلی نبود نمی خواستم از لینک استفاده کنم به همین جهت به روش زیر انجام دادم:
در درخواست اولیه:
public function create(Request $request, OtpService $otpService)
{
$request->validate([
'mobile' => 'required|regex:/(0)[0-9]/|not_regex:/[a-z]/|min:11',
]);
$user = User::where('mobile', $request->mobile)->first();
if ($user == null) {
return response()->json([
'message' => __('public.user.does_not_exist'),
'status' => 404
], 404);
}
$resetPassword = $user->resetPassword()->first(); // Get reset password from database
$result = $this->createResetPassword($resetPassword, $user, $otpService, $request); // if Not exist create new one or return null
if ($result) {
return response()->json([
'message' => __('public.user.reset.otp_sent'),
'status' => 200
], 200);
}
$resetPassword = $user->resetPassword()->first(); // Get reset password from database
$diff = Carbon::now()->diffInMinutes($resetPassword->last_retry_at);
if ($this->isPasswordRequestCountValid($resetPassword)) {
if ($diff <= self::RETRY_EXPIRE_MINUTE && $diff > self::RETRY_MIN_EXPIRE_MINUTE) {
$otpService->send($request->mobile, $resetPassword->otp);
return response()->json([
'message' => __('public.user.reset.otp_sent'),
'status' => 200
], 200);
}
}
if (!$this->isResetPasswordRequestValid($resetPassword, $diff)) {
return response()->json([
'message' => __('public.user.reset.too_many_requests', ['minute' => self::RETRY_EXPIRE_MINUTE - $diff]),
'status' => 429
], 429);
} else {
$resetPassword->delete();
return response()->json([
'message' => 'unknown',
'status' => 503
], 503);
}
}
در درخواست دوم:
public function find(Request $request)
{
$this->validateUserForConfirmCode($request);
$user = User::where('mobile', $request->mobile)->first();
$result = $this->isValidOtpCodeForResetPassword($user);
if (!$result) {
return response()->json([
'message' => __('public.user.unauthorized'),
], 401);
}
return response()->json([
'message' => __('public.user.reset.successfully_finished'),
'status' => 200,
], 200);
}
و در نهایت در درخواست سوم:
public function reset(Request $request, FirebaseNotification $firebaseNotification)
{
$request->validate([
'mobile' => 'required|regex:/(0)[0-9]/|not_regex:/[a-z]/|min:11',
'password' => 'required|string|confirmed',
'otp' => 'required|integer|min:0000|max:9999'
]);
$user = User::where('mobile', $request->mobile)->first();
$passwordReset = PasswordReset::where([['otp', $request->otp], ['user_id', $user->id]])->first();
if (!$passwordReset) {
return response()->json([
'message' => __('public.user.reset.unauthorized'),
'status' => 400
], 400);
}
$user = User::where('id', $passwordReset->user_id)->first();
if (!$user) {
return response()->json([
'message' => __('public.user.reset.not_found'),
'status' => 400
], 400);
}
$user->password = Hash::make($request->password);
$user->save();
$passwordReset->delete();
// Password Changed Successfully
$title = __('public.notifications.reset_password_successfully_done');
$body = __('public.notifications.reset_password_successfully_done_body');
$image = '#';
$badgeImage = '#';
$firebaseNotification->notify($user->fcm_token, $title, $body, $image, $badgeImage);
return response()->json([
'message' => __('public.user.reset.confirmation_successfully_finished'),
'status' => 200,
], 200);
}
از پروژه های بعدی از رمز عبور یکبار مصرف استفاده می کنم و برای همیشه از شر رمز عبور خلاص میشم