🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ وحید گروسی
نحوه پیاده سازی فراموشی رمز عبور در API
جامعه لاراول ایجاد شده در ۰۹ تیر ۱۳۹۹

سلام من از Passport برای پیاده سازی token و ... استفاده کردم

برای پیاده سازی فراموشی رمز عبور با استفاده از موبایل باید به چه روشی عمل کرد؟

از یک روشی استفاده کنید به عنوان مثال یک لینک تولید کنید که تاریخ انقضا داره و با اس ام اس ارسال کنید برای کاربر ...

یک جدول توی دیتابیس ایجاد کنید

یک url و یا کد فراموشی رمز رو توش ذخیره کنید

و بعد کاربر که کد رو برای api ارسال کرد با کتاب خونه carbon چک کنید تاریخش نگذشته باشه ...

و در آخر اگه همه چی اوکی بود اجازه آپدیت فیلد password رو بهش بدید

MohammadMoghadasi ۱۱ تیر ۱۳۹۹، ۰۸:۴۹

سلام محمد جان ممنون که پاسخ دادین
به دلیل اینکه ایمیلی نبود نمی‌خواستم از لینک استفاده کنم به همین جهت به روش زیر انجام دادم:
در درخواست اولیه:

 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);
    }

 

از پروژه‌های بعدی از رمز عبور یکبار مصرف استفاده می‌کنم و برای همیشه از شر رمز عبور خلاص میشم

وحید گروسی ۱۱ تیر ۱۳۹۹، ۰۹:۲۹