علت استفاده از token هنگام کار با RESTful API


#1

سلام
من دارم با جنگو یه rest api مینویسم قراره بعدا با vue بشه spa
الآن دارم برای Authentication از jwt استفاده میکنم!
به این صورته که یوزر نیم و پسوورد رو میفرسته و یه Token میگیره با یه lifetime محدود بعد هم یه توکن هست برای refresh کردن که اون هم Lifetime محدود داره ولی بیشتر از Token اصلی
حالا سوال اینجاست چرا هر سری که میخوایم یه کاری بکنیم از Token استفاده میکنیم؟ چرا هر دفعه همون user و pass رو نمیفرستیم برای تایید؟
یا اصلا چرا هر دفعه؟ چرا از session استفاده نمیکنیم مثل حالت عادی که از جنگو استفاده میشه؟ یعنی به این صورت که یه بار login کنیم و بعدا فقط ریکوئست هامونو بفرستیم بدون قرار دادن Token یا user و pass در Head تا زمانی که logout نکردیم.
کلا مفهوم API-Key و OAuth1 و 2 و کلا اینجور چیزا برام خیلی مبهمه و درکشون نمیکنم!!!


#2

مساله اینه که session به طور کلی RESTful رو نقض میکنه!
دلایل زیادی به ذهنم میرسه برای توجیه اینکه این پروتکل اینطوری تعریف شده. سخت‌افزارهای زیادی هستن که نمیتونن از همچین چیزهایی پشتیبانی کنن (مدارهای الکترونیکی که سیستم عامل ندارن و روی پردازنده‌ی ۸بیتی هستن) و یه سری دلایل دیگه. ولی شاید چیزهایی که من بهشون فکر میکنم، درست نباشن.

خوندن این سوال و جواب رو پیشنهاد میکنم.


پ.ن:
تا جایی که میدونم django راندمان بالایی در زمینه‌ی Restful api نداره و flask بهتره. البته اگه سایتی وجود داره و با جنگو نوشته شده مسلما بهتره api هم با جنگو نوشته بشه.


#3

سلام
وقتی کاربری یه بار sigin میشه و یه توکن بهش تعلق میگیره دفعه بعد که این کاربر درخواست بفرسته شما میتونید فقط این توکن رو بررسی کنی که صحت داره یا نه دیگه لازم نیست که هر دفعه بری از دیتابیس بپرسی که آیا همچین کاربری وجود داره یا نه.


#4

ممنون برای پاسخ
تا اینجا رو متوجه شدم
حلا این رو بگین که چرا از Token استفاده میکنیم و خود user و pass رو نمیفرستیم؟


#5

مگه token در database ذخیره نمیشه؟
خوب هر دفعه به جای این که چک کنم token تو db موجوده یا نه user و pass رو چک میکنم


#6

نه توکن رو معمولا توی local storage مرورگر یا توی هدر نگه میدارن فقط بررسی درستی توی بک اند صورت میگیره. به نظرم لزومی نداره توکن توی دیتابیس ذخیره بشه چون یه متغیره که هر دفعه با دفعه قبل فرق داره. اصلا چرا توکن رو باید توی دیتابیس ذخیره کرد؟


#7

پس Back-end چه جوری میفهمه token درسته یا نه ؟ :thinking: :thinking:


#8

کتابخانه ای که ازش برای درست کردن توکن استفاده میکنید خودش یک تابعی داره که صحت توکن رو بررسی میکنه


#9

دو تا سوال دیگه هم برای من به وجود اومده

طبق توضیحات این لینک درخواست های REST باید تمام موارد مورد نیاز رو داشته باشن و session این رو نقض میکنه چون اگه بخوایم از session استفاده کنیم اول باید session ایجاد بشه
با توجه به این که با REST ممکنه قصد ایجاد app اندروید و iOS رو داشته باشیم چنین موردی کاملا منطقی هست اما برای من که فقط میخوام یه وب سایت داشته باشم نه هیچ چیز دیگه این موارد مزیت به حساب نمیاد
تنها دلیل من برای استفاده از REST اینه که میخوام SPA ایجاد کنم و نه الآن و نه هیچ وقت دیگه نیاز به ایجاد اپ اندروید برای این سایت نیست!


سوال دوم این که قضیه این Token دوم برای Refresh چیه؟


#10

توکن وقتی قراره چک بشه، یه کوئری میزنیم از دیتابیس میگیریمش میبینیم اوکی هست یا نه.
ولی پسورد به صورت hash توی دیتابیس ذخیره میشه. هر وقت میخوایم پسورد رو چک کنیم، باید hash چیزی که کاربر وارد کرده رو حساب کنیم (که طول میکشه و فشار به CPU میاره) بعد ببینیم برابر با دیتای موجود در دیتابیس هست یا نه.
فشاری که به CPU میاره و زمانی که طول میکشه، بستگی به الگوریتم هش داره ولی به هر حال خیلی خیلی سختتر میشه و زمان بیشتری میگیره تا اینکه فقط توکن رو چک کنیم.

توکن هم اصولا hash هست. ولی هشی که یک بار فقط ساخته میشه و به همون شکلی که هست ارسال و دریافت و تست میشه. (با هر Transaction از یه string هش گرفته نمیشه)

خوب ربطی نداره! Restful یعنی این چیزی که گفته شده. شما اگه میخواید روش دیگه‌ای رو پیش ببرید هیچ مشکلی نداره. فقط اسمش restful نیست.
اگه کتابخونه‌ها و فریموورک ها جلوی انعطاف کارتون رو میگیرن، مجبورید از چیز دیگه‌ای استفاده کنید یا کتابخونه‌ی مورد نیازتون رو بنویسید.

نمیدونم. تا حالا با همچین چیزی مواجه نشدم شاید به خاطر امنیت بالاتر.


#11

یعنی شما میگید از in-memory دیتا بیس استفاده کنیم؟


#12

نخیر. من کی گفتم؟


#13

یعنی شما میگید که تو دیتابیس ذخیرش کنیم؟ چه احتیاجی به این کار هست؟


#14

چند روش وجود داره برای نگهداری توکن. یکیش اینه که توی جدول users یا هر جایی که مربوط به کارمون هست، نگهش داریم.
شاید لایبرری که استفاده میکنید روش دیگه‌ای داشته باشه مثلا in-memoryدیتابیس. یا نگه‌داری توکن‌ها توی یه set() یا هر روش دیگه‌ای.


#15

jwt و یا google macaroons رو ببینید


#16

شما هم ذخیره توکن توی دیتابیس رو پیشنهاد میکنید؟ آیا لزومی داره؟


#17

بستگی به کاربرد داره. اما در کل Oauth2 رو پیشنهاد می کنم.