رضا
4 سال پیش توسط رضا مطرح شد
6 پاسخ

احرازهویت با شماره موبایل با api لاراول

سلام وقت بخیر
من میخواهم تئوری احراز هویت با شماره موبایل بدون پسورد را بصورت api در لاراول پیاده سازی کنم.در واقع کاربر با وارد کردن شماره موبایل برایش یک کد 4 رقمی اس ام اس می شود و بعد در صورت صحیح بودن کد 4 رقمی ارسال شده لاگین میشود و یا کاربر ثبت نام میشود و در آخر یک توکن (apitoken) برای کاربر ثبت نام شده یا لاگین شده ایجاد میشود.
حالا من میخواهم ثبت نام و لاگین در یک تابع به اسم auth اجرا شود و نمیخواهم تابع لاگین و ریجستر جدا باشند و در پیاده سازیش به مشکل خوردم ممنون میشم راهنمایی بفرمایید.؟!؟!
برای این کار دو روت در نظر گرفتم که یک روت مربوط به احرازهویت و دیگری مربوط به دریافت کد اس ام اسیی
api.php:

Route::namespace('api')->group(function (){
    Route::prefix('auth')->namespace('core')->middleware('guest')->group(function (){
        Route::post('login', 'AuthController@auth');
        Route::post('token', 'TokenController@token');
    });
});

AuthController:

    public function auth(Request $request)
    {
        $validLogin = $request->validate([
            'phone' => ['required' ,
                        'regex:/^09(1[0-9]|3[1-9]|2[1-9])-?[0-9]{3}-?[0-9]{4}$/' ,
                        'exists:users,phone'
            ]
        ]);
        $validregister = $request->validate([
            'phone' => ['required' ,
                        'regex:/^09(1[0-9]|3[1-9]|2[1-9])-?[0-9]{3}-?[0-9]{4}$/' ,
                        'unique:users,phone'
            ]
        ]);

        $user = User::wherePhone($validregister['phone'])->first();
        $apiToken = Str::random(100);
        if ($user === null) {
            $user = User::create([
                'phone' => $validregister['phone'],
                'first_ip' => $request->ip(),
                'location' => 1,
                'api_token' => hash('sha256', $apiToken),
            ]);
        }
        $code = ActiveCode::generateCode($user);
        $user->notify(new ActiveCodeNotification($code , $user->phone));

        return response()->json($user);
    }
  • کد AuthController مشکل دارد و ناقص است.

ثبت پرسش جدید
محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 4 سال پیش مطرح شد
0

@Megairan
سلام.
مشکل از اون دو تا form validation هستش.
نیازی به اولی نیست.


رضا
تخصص : Laravel Developer
@Megairan 4 سال پیش مطرح شد
0

سلام مجدد
@mohsenbostan
ممنونم بابت پاسخگویی تون بله مشکل از اون ولیدیشن ها هست اما من میخواستم برای لاگین ولیدیشن خودش و برای ریجستر ولیدیشن مربوط بهش رو استفاده کنم.به همین دلیل هر دوتا استفاده کردم.
راه حلی برای ثبت نام و لاگین در یک تابع به اسم auth دارید؟
و همینطور در قسمت چک کردن کد اس ام اس شده چطوری باید چک کنم ؟؟ البته این تئوری رو سمت وب با سشن تست کردم و جواب گفتم منتها سمت api این قسمت چک کردن کد اس ام اسی و بعد ایجاد توکن رو موندم.!!؟
و در ادامه مورد دیگه ای که هست اکثرا از پاسپورت برای oauth استفاده میکنند و با این ویژگی میشناسند.من تاحالا از پاسپورت توی پروژه هام استفاده نکردم و میخواستم بدونم چیزی برای jwt داره؟؟ و برای پروداکشن مناسب هست؟؟اول خواستم از پکیج jwt استفاده کنم اما در ایشیوهای گیتهابش رو نگاه کردم فهمیدم برای حالت پروداکشن مناسب نیست.
ممنون میشیم از شما و سایر دوستان در این مورد راهنمایی بفرمایید.
@ali.bayat
@TimeRunner2359
@hosseinshirinegad98
@mhyeganeh
@hesammousavi


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش آپدیت شد
1

سلام برای احراز هویت با کد پویا سه تا کار باید انجام شه
1 - کاربر شماره موبایلشو وارد میکنه و دکمه ارسالو میزنه
2 - یک کد براش به شماره موبایلش ارسال میشه
3 - کدووارد کرده و دکمه ورودو میزنه
4 - در بک اند این کد برسی میشه اگه از اعتبار کافی برخوردار بود دو کار انجام میشه ابتدا برسی میشه که چنین کاربری قبلا با این شماره موبایل ثبت نام کرده که اگه قبلا رجیستر کرده بود همون جا لاگین میشه و تمام.
اما اگر چنین کاربری با این شماره موبایل یافت نشد ابتدا کاربر رجیستر میشه و بعد لاگین میکنه.
برای این که این مواردو انجام بدین نیاز به دو تا اکشن در سرور خواهید داشت و راه معقولش هم همین خواهد بود
1- ارسال کد یکبار مصرف به شماره موبایل
2 - دریافت کد یکبار مصرف و برسی صحت آن و چک کردن اینکه کاربر از قبل در سیستم هست یا نه
اگر شما میخواین از یک اکشن استفاده کنید میتونید به صورت پارامتر تعیین کنید که کدوم قسمت اجرا بشه متد auth شما هم میتونه یک نشونه یا مقداری برای ارسال کد یا زمان لاگین یا رجیستر ، در واقع با اون مقدار نوع عملیات هم مشخص میشه.
jwt هم خوبه میتونید ازش استفاده کنید دوره api راکت هم با jwt کار کرده.


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 4 سال پیش مطرح شد
0

@Megairan
نیازی به دو تا validaation ندارید!
این مورد رو بزارید بمونه:

$validregister = $request->validate([
            'phone' => ['required' ,
                        'regex:/^09(1[0-9]|3[1-9]|2[1-9])-?[0-9]{3}-?[0-9]{4}$/' ,
                        'unique:users,phone'
            ]
        ]);

بعد به جای اون همه شلوغ کاری و کد به اصطلاح کثیف، کافیه از متد firstOrCreate استفاده کنید. این خودش اول بررسی میکنه، اگر کاربر بود، اون رو برگشت میده در غیر این صورت اون رو ایجاد می کنه.

درمورد passport هم باید بگم که کامل ترین و بهترین پکیج هستش برای این کار. و صد در صد برای production هم مناسبه.
البته یک پکیج سبک تر و ساده تر داریم به اسم Sanctum که اونم راهکار خوبیه.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

API ها Stateless هستند. پس سشنی نیست که شما مقداری دهی کنی
برای همین باید از توکن استفاده کنی که دوستان توضیح دادند


متین نوعی
@matin_noei 3 ماه پیش مطرح شد
0

سلام وقت بخیر مشکل شما حل شد؟ ممنون میشم به اشتراک بزارید.
سوال دیگه ای که دارم اینه که آیا شما برای انجام ثبت نام و ورود به این روش از پکیج Fortify استفاده کردید؟


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام