سلام وقت بخیر
من میخواهم تئوری احراز هویت با شماره موبایل بدون پسورد را بصورت 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);
}
سلام مجدد
@mohsenbostan
ممنونم بابت پاسخگویی تون بله مشکل از اون ولیدیشن ها هست اما من میخواستم برای لاگین ولیدیشن خودش و برای ریجستر ولیدیشن مربوط بهش رو استفاده کنم.به همین دلیل هر دوتا استفاده کردم.
راه حلی برای ثبت نام و لاگین در یک تابع به اسم auth دارید؟
و همینطور در قسمت چک کردن کد اس ام اس شده چطوری باید چک کنم ؟؟ البته این تئوری رو سمت وب با سشن تست کردم و جواب گفتم منتها سمت api این قسمت چک کردن کد اس ام اسی و بعد ایجاد توکن رو موندم.!!؟
و در ادامه مورد دیگه ای که هست اکثرا از پاسپورت برای oauth استفاده میکنند و با این ویژگی میشناسند.من تاحالا از پاسپورت توی پروژه هام استفاده نکردم و میخواستم بدونم چیزی برای jwt داره؟؟ و برای پروداکشن مناسب هست؟؟اول خواستم از پکیج jwt استفاده کنم اما در ایشیوهای گیتهابش رو نگاه کردم فهمیدم برای حالت پروداکشن مناسب نیست.
ممنون میشیم از شما و سایر دوستان در این مورد راهنمایی بفرمایید.
@ali.bayat
@TimeRunner2359
@hosseinshirinegad98
@mhyeganeh
@hesammousavi
سلام برای احراز هویت با کد پویا سه تا کار باید انجام شه
1 - کاربر شماره موبایلشو وارد میکنه و دکمه ارسالو میزنه
2 - یک کد براش به شماره موبایلش ارسال میشه
3 - کدووارد کرده و دکمه ورودو میزنه
4 - در بک اند این کد برسی میشه اگه از اعتبار کافی برخوردار بود دو کار انجام میشه ابتدا برسی میشه که چنین کاربری قبلا با این شماره موبایل ثبت نام کرده که اگه قبلا رجیستر کرده بود همون جا لاگین میشه و تمام.
اما اگر چنین کاربری با این شماره موبایل یافت نشد ابتدا کاربر رجیستر میشه و بعد لاگین میکنه.
برای این که این مواردو انجام بدین نیاز به دو تا اکشن در سرور خواهید داشت و راه معقولش هم همین خواهد بود
1- ارسال کد یکبار مصرف به شماره موبایل
2 - دریافت کد یکبار مصرف و برسی صحت آن و چک کردن اینکه کاربر از قبل در سیستم هست یا نه
اگر شما میخواین از یک اکشن استفاده کنید میتونید به صورت پارامتر تعیین کنید که کدوم قسمت اجرا بشه متد auth شما هم میتونه یک نشونه یا مقداری برای ارسال کد یا زمان لاگین یا رجیستر ، در واقع با اون مقدار نوع عملیات هم مشخص میشه.
jwt هم خوبه میتونید ازش استفاده کنید دوره api راکت هم با jwt کار کرده.
@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 که اونم راهکار خوبیه.
API ها Stateless هستند. پس سشنی نیست که شما مقداری دهی کنی
برای همین باید از توکن استفاده کنی که دوستان توضیح دادند
سلام وقت بخیر مشکل شما حل شد؟ ممنون میشم به اشتراک بزارید.
سوال دیگه ای که دارم اینه که آیا شما برای انجام ثبت نام و ورود به این روش از پکیج Fortify استفاده کردید؟
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟