ورود

View Full Version : چک کردن token برای احراز هویت



aynaz96
دوشنبه 01 آبان 1396, 16:13 عصر
سلام من زیاد با برنامه نویسی اندروید آشنایی ندارم. یه پروژه دارم که برای احراز هویت در اون از Token استفاده میکنم و هم خود token که شامل expire time میشه هم تاریخ expire time در mysql ذخیره میشه.
میخواستم بدونم چجوری میتونم expire time token مربوط به کاربر چک کنم در صفحات مختلف که آیا تموم شده یا نه. اگر تموم شد token پاک شه و دوباره لاگین شه

این پاسخ تو تاپیک ها پیدا کردم ولی تو تحلیلش مشکل دارم:


روشی که من استفاده می کنم بر اساس توکن (Token) هست.

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

این توکن باید جایی در برنامه ذخیره بشه، حالا SharedPreference یا هر محل ذخیره سازی دیگه.

چک کردن لاگین بودن یا نبودن هم فقط این میشه که چک کنیم مقدار توکن null نباشه. حالا اگر توکن null نباشه، فرض بر اینه که کاربر حداقل یکبار لاگین کرده و به صفحه ی بعد هدایتش می کنیم،
اما ممکنه این توکن دیگه اعتبار نداشته باشه، برای همین در هرکدوم از درخواست هایی که به سمت سرور ارسال میشه، اگر پاسخ این بود که توکن معتبر نیست، کاربر رو logout می کنیم که درواقع این هست که توکن رو از جایی که ذخیره ش کردیم پاک کنیم و دوباره به صفحه ی لاگین هدایتش کنیم.

میخوام بدونم چجوری میتونم توکن همراه با درخواست ها ی هر قسمت ارسال کنم؟ یعنی چجوری توکن به هر قسمت فرستاده میشه بعد لاگین؟

Nevercom
دوشنبه 01 آبان 1396, 17:44 عصر
محل مناسب ارسال توکن، در هدر (Header) درخواست ها (تمتم Request ها) هست.

الگوی من اینه که یک متد دارم که تمام درخواست ها از طریق اون ارسال میشه، و در اون متد هنگام ارسال درخواست هدر مناسب رو ست می کنم. پاسخی که از سرور دریافت می کنم رو هم قبل از تحویل به درخواست دهنده، بررسی می کنم و اگر Response Status برابر 401 بود، به نحوی اطلاع میدم که باید دوباره لاگین بشه. درواقع چون تمام درخواست ها از این مسیر می‌گذره، کنترل کامل روی درخواست ها و پاسخ ها دارم.

برای اینکه در تمام درخواست ها، در صورت دریافت خطای 401 به صفحه‌ی لاگین هدایت بشه راه های متفاوتی هست، مثلاً استفاده از Broadcast Receiver یا Event Bus و یا نمایش یک دیالوگ که با زدن دکمه ای به اکتیویتی لاگین هدایت بشه. بستگی به ساختار برنامه و تصمیم خودتون داره.

سرور هم هر درخواستی که میاد رو چک می کنه که آیا:

برای دسترسی به این Resource نیاز به لاگین بودن هست یا خیر (مثلن برای مسیرهای login یا signup یا مسیرهای عمومی، نباید توکن چک بشه)
اگر نیاز به لاگین بودن هست آیا توکن ارائه شده ؟

اگر ارائه شده ایا اعتبار داره ؟
اگر معتبر هست آیا تاریخ انقضاش فرا رسیده یا نه
و نهایتن اگر سیستم بر مبنای Permission هست، آیا این یوزر خاص مجوز دسترسی به این ریسورس رو داره یا خیر (مثلاً یه کاربر با توکن معتبر نباید بتونه بعضی چیزا رو Delete کنه درصورتی که مدیر میتونه)



اگر هرکدوم از این شرط ها برآورده نشد، سرور پاسخ خطا میده و Status Code رو هم متناسب با نوع خطا ست می کنه (401 برای لاگین نبودن یا معتبر نبودن توکن، 403 برای مجوز نداشتن...)