سلام دوستان
وقتتون بخیر
لطفا اگر در مورد روش پیاده سازی قابلیت مدیریت ورود به سایت و اپلیکیشن(مثل همین وب سایت راکت و یا اپلیکیشن تلگرام) اطلاعاتی دارید و یا آموزشی سراغ دارید، ارسال بفرمایید.
خواهش میکنم.
۱) شما دو مبحث جدا رو دارید بررسی میکنید.. authentication و authorization.
در نهایت کاربر چه ادمین باشه و چه کاربر معمولی .... یک user حساب میشه دیگه.. شما تمام کاربران API تون رو با Passport احراز هویت میکنید و سپس برای مجازسازی های لازم و پرمیشن ها میتونی از Policy ها استفاده کنی و یا حتی میدل ور ها..
حتی میتونی گاردهای کاستوم هم درست کنی :
https://laravel.com/docs/6.x/authentication#adding-custom-guards
۲) من با tymon/jwt-auth کار نکردم اما داخل تنظیمات Passport گزینه ای داریم به نام Token Lifetimes . میتونید برای گاردهای مختلف ادمین و کاربر Lifetime های جدا تعریف کنید. خارج از Passport هم کار چندانی نداره.
۳) اینکه بیایم برای کاربر تحت وب، توکن تعریف کنیم.. کار معقولی نیست:
ما در API کاربر رو با توکن احراز هویت میکنیم چونگه بین درخواست های API هیچ سِشنی قابل ذخیره نیست و تنها نقطه ای که میشه باهاش کاربر رو از غیر کاربر تشخیص داد، همون توکن هست.
۳-۱) برای اینکه کاربر رو از دستگا های مختلف Logout کنی لاراول متدهایی داره مثل:
Auth::logoutCurrentDevice();
Auth::logoutOtherDevices();
اینجوری دستگاه های تحت وب رو Logout میکنی . برای اینکه کاربران API رو Logout کنی »» Passport راحت امکان این کارو فراهم میکنه:
$userTokens = $userInstance->tokens;
foreach($userTokens as $token) {
$token->revoke();
}
حالا که هر ۲ روش رو میدونید وقتی در یک جا Logout صورت میگیره .. Logout رو در جای دیگه هم اعمال کنید.. مثلا در متد کنترلر که کاربر Logout میکنه چک کنید اگر با IP کاربر .. توکنی در دیتابیس دارید اونها رو حذف کنید.
۳-۲) بله .. یگی از گزینه های استفاده از میدلور ها، برای همینجور کارها هست
در پایان پیشنهاد میدم دوره لاراول رو که از Passport استفاده میشه رو کاملا بررسی کنید.
فلسفه استفاده از گاردهای مختلف برای احراز هویت دقیقا همینه..
یعنی شما به صورت عادی کاربرانی رو که وارد سایت میشند، با گارد web احراز هویت میکنید. این که دیگه ساده است و نیاز به توضیح خاصی نداره.
اما برای اپلیکیشن.. شما باید از طریق API احراز هویت رو انجام بدید; که ساز و کاری شبیه به زیر داره:
در فایل config/auth.php یک گارد api تعریف شده که از توکن درایور استفاده میکنه. این درایور مسئول بررسی توکن ها در درخواست های ورودی هست..
یعنی بررسی میکنه که توکن کاربر با توکنی که در دیتابیس داریم یکی باشه.
قبل از استفاده از توکن درایور یه سری کارها باید انجام بدید:
Schema::table('users', function ($table) {
$table->string('api_token', 80)->after('password')
->unique()
->nullable()
->default(null);
});
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'api_token' => Str::random(80),
]);
}
پس از مراحل بالا.. میتونید از میدلور auth:api استفاده کنید و از Route هایی که میخواهید محافظت کنید.
3 نوع بالا با مثال در مستندات موجوده:
https://laravel.com/docs/6.x/api-authenticationpassing-tokens-in-requests
لاراول خودش احراز هویت از طریق API رو انجام میده و مشکلی هم نداره ... اما برای پروژه های بزرگ خود توسعه دهنده های لاراول پیشنهاد میکنند از Passport استفاده بشه:
Note: While Laravel ships with a simple, token based authentication guard, we strongly recommend you consider using Laravel Passport for robust, production applications that offer API authentication.
@ali.bayat تشکر فراوان از شما دوست عزیز
موضوعی که ذهن من رو درگیر کرده اینه که
1- لاراول پاسپورت فقط برای کاربران هست و اگر ما چند نوع کاربر داشته باشیم چطور میتونیم از لاراول پاسپورت استفاده کنیم؟
2- من اگر از tymon/jwt-auth استفاده میکنم، چطور می تونم مثلا برای انقضا شدن توکن ها برای ادمین ها یک زمانی رو قرار بدم و برای کاربرام یک زمان؟
3- من میخوام برای هر کاربر توکن های مختلفی تعریف بشه(یعنی هم برای ورود وب و هم اپ) اطلاعات کامل دستگاهشو داشته باشم و هر وقت لازم بود از تمام دستگاه ها خارجش کنم. حالا :
3-1 - آیا پیاده سازی این مواردی که عرض کردم در کنار هم با jwt امکان پذیره یا باید لاراول پاسپورت استفاده کنم و اگر باید پاسپورت استفاده کنم به چه صورت موارد بالا رو هم داشته باشم؟
3-2- اگر من کاربرو خارج کردم، با میدلور همیشه باید چک کنم که یک کاربر فعاله یا وارد شده یا نه که اجازه ی دسترسی به پنلشو داشته باشه؟ و یا باید از روش دیگه ای استفاده کنم؟
خیلی ممنونم از لطفتون و راهنمایی هاتون
@hesammousavi لطفا شما هم اگر امکانش هست راهنمایی کنید
لطفا اگر امکانش هست در این نوع موارد و نکات ریزی که در لاراول وجود داره و در سطح حرفه ای هست هم دوره ای تهیه کنید.
خواهش میکنم.
۱) شما دو مبحث جدا رو دارید بررسی میکنید.. authentication و authorization.
در نهایت کاربر چه ادمین باشه و چه کاربر معمولی .... یک user حساب میشه دیگه.. شما تمام کاربران API تون رو با Passport احراز هویت میکنید و سپس برای مجازسازی های لازم و پرمیشن ها میتونی از Policy ها استفاده کنی و یا حتی میدل ور ها..
حتی میتونی گاردهای کاستوم هم درست کنی :
https://laravel.com/docs/6.x/authentication#adding-custom-guards
۲) من با tymon/jwt-auth کار نکردم اما داخل تنظیمات Passport گزینه ای داریم به نام Token Lifetimes . میتونید برای گاردهای مختلف ادمین و کاربر Lifetime های جدا تعریف کنید. خارج از Passport هم کار چندانی نداره.
۳) اینکه بیایم برای کاربر تحت وب، توکن تعریف کنیم.. کار معقولی نیست:
ما در API کاربر رو با توکن احراز هویت میکنیم چونگه بین درخواست های API هیچ سِشنی قابل ذخیره نیست و تنها نقطه ای که میشه باهاش کاربر رو از غیر کاربر تشخیص داد، همون توکن هست.
۳-۱) برای اینکه کاربر رو از دستگا های مختلف Logout کنی لاراول متدهایی داره مثل:
Auth::logoutCurrentDevice();
Auth::logoutOtherDevices();
اینجوری دستگاه های تحت وب رو Logout میکنی . برای اینکه کاربران API رو Logout کنی »» Passport راحت امکان این کارو فراهم میکنه:
$userTokens = $userInstance->tokens;
foreach($userTokens as $token) {
$token->revoke();
}
حالا که هر ۲ روش رو میدونید وقتی در یک جا Logout صورت میگیره .. Logout رو در جای دیگه هم اعمال کنید.. مثلا در متد کنترلر که کاربر Logout میکنه چک کنید اگر با IP کاربر .. توکنی در دیتابیس دارید اونها رو حذف کنید.
۳-۲) بله .. یگی از گزینه های استفاده از میدلور ها، برای همینجور کارها هست
در پایان پیشنهاد میدم دوره لاراول رو که از Passport استفاده میشه رو کاملا بررسی کنید.
@ali.bayat تشکر از لطفتون خیلی پاسختون خوب و جامع بود
چون من قبلا مقداری با پاسپورت کار کرده بودم و user_id رو تو یکی از جداولش دیده بودم گفتم شاید مقلا برای admin_id محلی نداشته باشه.
برای وب هم نمیخوام توکن ذخیره کنم. فقط میخوام تمام دستگاه های وارد شده مشخص باشن
دقیقا مثل همین کاری که الان در پنل راکت وجود داره
کاری که در راکت انجام میشه رو .. من سورس کدش رو ندیدم اما حدسم اینه که:
در راکت از درایور database برای ذخیره سشن ها استفاده میشه
و این یه جدول به نام sessions به پروژه اضافه میکنه که فیلد user_id درش unique نیست.
بدین معنی که برای یک کاربر سشن های مختلفی میتونه ذخیره بشه.
بعد شما براحتی اونها رو نمایش میدید و در صورت نیاز حذفشون میکنید.
در مورد روش دقیقش بهتره از @hesammousavi بپرسید که راهکار ایشون چی بوده؟
اما به طور کلی Passport واقعا امکانات جالبی داره و پیاده سازی سیستم OpenAuthentication یا همون oAuth رو راحت تر میکنه .. در کنارش میتونید از Socialite هم که جز اکو سیستم لاراول هست استفاده کنید و کاربرانتون براحتی از طریق Google و GitHub و Twitter و ... هم به سیستم وارد بشند.
پیروز باشید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟