سلام من از 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); }
از پروژههای بعدی از رمز عبور یکبار مصرف استفاده میکنم و برای همیشه از شر رمز عبور خلاص میشم