باسلام خدمت استاد گرامی
من چندتا سوال در این مورد داشتم:
1- برای اینکه کاربر رو لاگین نگه داریم باید از کوکی ها استفاده کنیم؟
2- برای اینکه اطلاعات حساس کاربر سرقت نشه روشی که به ذهن من رسید این بود که یه جدول در پایگاه داده ایجاد کنیم که در اون دو ستون user_id و login_token باشه و به این صورت عمل کنه که بعد از هر بار لاگین یه رشته رندوم ایجاد کنه و اون رو در کوکی و در ستون پایگاه داده وارد کنه و به این شکل با مطابقت دادن ستون توکن و آیدی کاربر به اطلاعات اون دسترسی پیدا میکنیم، بعد از لاگ اوت هم کوکی و رکورد مربوطه در پایگاه داده حذف میشود. به نظر شما این روش درسته؟
3- لطفا اگر روش بهینه تر و بهتری برای این موضوع هست معرفی کنید.
باتشکر
آقای گازری راه کار بهتر که استفاده میشه، استفاده از token هاست! حالا توکن چیه؟
ببنید توکن ها یه سری رشته و اعداد رندوم طولانی هستند و شما میتونید زمانی که کاربر شما لاگین میکنه اونو بسازید. حالا توکن ساخته شده رو چی کار کنم؟
یه جدول داخل دیتابیس ایجاد کنید که 4 تا فیلد داره به ترتیب، id - token - user_id - expires__at.
هر بار که کاربر لاگین میکنه یه token براش ایجاد کنید و آیدی کاربر، توکنی که براش ساخته شده و تاریخ انقضا اون کاربر رو توی این table که بهتون گفتم ذخیره سازی کنید. ضمنا توکن ساخته شده رو توی کوکی کاربر هم ذخیره کنید. حالا خیلی راحت هر موقع که لازم داشتید توکنی که توی کوکی ذخیره سازی کردید رو بردارید و یه کوئری به دیتابیس بزنید و user_id رو دریافت کنید و حالا با اطلاعات کاربر هرکاری دوست داشتید انجام بدید.
این کار امنیت خیلی بیشتری داره چون اگه کسی اون توکن از توی کوکی شما بدزده هیچ کاری نمیتونه باهاش بکنه چون یه سری حروف و اعداد بی معنین که توسط هیچ مقدار هش شدهای نیستن. همچنین میتونید براش تاریخ انقضا توی فیلد expires_at قرار بدید.
حالا چه جوری token ایجاد کنیم؟
$token= hash_hmac('sha256', 'some data', bin2hex(random_bytes(32));
درباره متد hash_hmac هم یه جستجو کنید و بیشتر باهاش آشنا بشید، این کد رو برای هر کاربر که لاگین میکنه اجرا کنید، الان متغیر token داخل کد حاوی توکن ساخته شدست و میتونید توی tableی که بهتون گفتم ذخیره سازی کنید.
باز اگه سوالی بود بپرسید من در خدمتم، موفق باشید.
سلام و احترام
شما میتونید از Session برای زخیره سازی آیدی کاربر اقدام کنید که روش امن تری هست. در مورد توکنی هم که گفتید میتونید همچین کاری رو هم کنید حتی لازم نیست شما توکن رو توی دیتابیس ذخیره سازی کنید بلکه میتونید همون توکن رو توی session هم ذخیره کنید.
میتونید از redis هم برای ذخیره سازی این token ها استفاده کنید که سرعت بیشتری داره و سبک تر هم هست.
این موردی رو که اشاره کردید برای logged out بودن کاربر هم درسته شما میتویند اون token رو نابود کنید هنگامی که کاربر logout میکنه.
باسلام مجدد
ممنون بابت پاسخی که دادید.
در حال حاظر من از سشن هابرای ذخیره آیدی کاربر استفاده کردم اما مشکلی که دارن بعد از بسته شدن مرورگر و گذشت زمان 30 دقیقه ای پیش فرض سشن ها از بین میرن و کاربر لاگین نمیمونه.
تنظیم زمان برای سشن ها هم بی فایده بود :
ini_set('session.cookie_lifetime','864000');
سلام مجدد
اگر آیدی اون کاربر رو هش کنم داخل کوکی چجوری میتونم اون هش به آیدی برگردونم و از اون طریق به اطلاعات پایگاه داده دسترسی پیدا کنم؟
خب اینطوری که باید آی دی همه کاربرا رو بگیرم و هش کنم و با هش مقایسه کنم. به نظرتون این کار درسته؟
اگر تعداد کاربرها بالا بره این کار منطقیه؟
ن ببینید کد شما برای هر کاربر به صورت جدا اجرا میشه و چیزی قاطی نمیشه، خیلی از اپلیکیشن های هستند که کارای خیلی بیشتری با session ها و cookie برای هر کاربر انجام میدن. شما به وب سایت های بزرگ هم سر بزنید برای شما کلی cookie ٍثبت میشه. حالا اگه نرم افزار شما بزرگ شد شما راه کار های بهتری دارید. برای مثال میاید از Redis استفاده میکنید که مثلا session شما خیلی بهینه تر ذخیره بشه و بتونید مدیریتشون کنید. توی use case شما کار پیچیده ای نیست چون شما آیدی کاربر رو دریافت میکنید و هش میکنید و در نهایت توی کوکی ذخیره سازی میکنید.
سلام مجدد
خیلی ممنون از وقتی که گذاشتید ?
جسارتا این همون روشی است که اول در بالا گفته بودم؟