سلام
من میخوام قبل از ارسال درخواستم به بک اند توی فرانت وضعیت زمان منقضی شدن jwt رو چک کنم که معتبر هست یا نه
الان مشکلم اینه وقتی jwt رو decode میکنم و باز زمان سیستم مقایسه میکنم به مشکل اختلاف یک ساعته ای که امسال زحمت کشیدن و ساعت ها رو تغییر ندادن برخورد میکنم
یعنی من توی بک اند و سروری که توی ایرانه jwt رو روی 15 دقیقه ست کردم و اگه الان ساعت 11:15 هست روی 11:30 اکسپایر باید بشه ولی توکن رو دیکود که میکنم و چک میکنم زمان اکسپایر رو زده 12:30
حالا من توی فرانت دارم زمان اسکپایر رو با زمان الانم که مثلا 11:31 هست مقایسه میکنم میگه توکن معتبره در حالی که معتبر نیست و ریکوئست به بک میره میزنه معتبر نیست چون توی بک jwt داره طبق زمان خودش مقایسه رو انجام میده
از پکیج زیر هم استفاده کردم ولی اونم همین مشکل یک ساعت رو داره:
https://www.npmjs.com/package/jwt-check-expiration
ضمنا نمیخوام هر سال دو بار دستی زمان رو توی فرانت تغییر بدم و یک فروردین یک ساعت اضافه کنم و اول مهر هم تغییر بدم دوباره
سلام دوست من 🖐 امیدوارم حالت خوب و عالی باشی✨
مشکلی که شما با اختلاف یک ساعته در زمان انقضای JWT داری، به علت تفاوتهای زمانی در سرورها و کلاینتهای مختلف ممکن است اتفاق بیفته. برای حل این مشکل، میتونی از یکی از روشهای زیر استفاده کنی
تنظیم زمان سرور به صورت دقیق:
اگر ممکن است، تنظیمات زمان سرور را به صورت دقیقتر کنی و اطمینان حاصل کنی که سرور به زمان دقیق جهانی (UTC) تنظیم شده باشه. این کار مشکل اختلاف زمانها را برطرف میکنه.
استفاده از یک زمان منحصر به فرد (Unique Identifier) توی JWT:
به جای اعتماد به ساعت سیستم، میتونی یک زمان منحصر به فرد (مثلاً تعداد ثانیههای گذشته از یک زمان معین) را به عنوان زمان انقضای JWT در نظر بگیری. این کار مشکل تفاوتهای زمانی رو برطرف میکنه. در بکاند، تو زمان انقضای JWT را بر اساس این مقدار تعیین کن و در فرانتاند هم مقدار مشابهی رو برای مقایسه با زمان فعلی استفاده کن.
مثال در Node.js:
در بکاند:
const jwt = require('jsonwebtoken');
// تعیین زمان انقضای JWT به عنوان تعداد ثانیههای گذشته از زمان فعلی
const expiresIn = 15 * 60; // مثال: 15 دقیقه
const currentTime = Math.floor(Date.now() / 1000);
const expirationTime = currentTime + expiresIn;
const token = jwt.sign({ /* اطلاعات کاربر */ }, 'رمز عبور', { expiresIn });
// ارسال توکن به فرانتاند
در فرانتاند:
const jwt = require('jsonwebtoken');
const token = /* دریافت توکن از بکاند */ ;
const currentTime = Math.floor(Date.now() / 1000);
try {
const decodedToken = jwt.verify(token, 'رمز عبور');
if (decodedToken.exp <= currentTime) {
// توکن منقضی شده است
// انجام اقدامات مورد نیاز مثل ورود مجدد کاربر
} else {
// توکن معتبر است
}
} catch (error) {
// خطا در تجزیه و تحلیل توکن
}
این روش بهت این امکان را میده که بر اساس یک زمان مشخص و منحصر به فرد برای تعیین انقضای JWT استفاده کن و مشکل اختلافهای زمانی رو برطرف میکنه.
امیدوارم پاسخم بهت کمک کرده باشه ❤️
موفق و پیروز باشی 🤘🌹
سلام
ممنون دوست عزیر بابت پاسختون
این کدی هست که من دقیقا زدم فقط من برای گرفتن تایم از jwtdecode استفاده میکنم چون کلید jwt رو نمیشه سمت فرانت گذاشت ولی بهرحال زمان انقضا توی دیکد توکن هست و از اون استفاده میکنم برای سنجش منقضی شدن توکن
فرانت و بک هم روی یک سیستمه
یعنی من یه ویرچوال باکس نصب کردم و یه ابونتو بالا اوردم و بک اند رو روی اون راه اندازی کردم فرانت هم که خود سیستم اصلیمه
jwt هم برای تعیین زمان انقضا از تاریخ timestamp استفاده میکنه و datenow() در فرانت هم timestamp میده ولی فقط مشکل همون یک ساعت اختلافیه که نمیدونم چرا با هم یکی نیستن
البته الان توی دو تا سایت زمان سیستم رو رفتم چک کردم اونجا یکی درست و یکی اشتباه نشون میده و با زمان سیستم من یکی نیست
سایت https://www.unixtimestamp.com/ زمانو یک ساعت کمتر نشون میده
سایت https://www.timeanddate.com/ زمانو درست نشون میده
توی کنسول هم datenow میزنم و کانورت میکنم ساعتو یک ساعت کمتر نشون میده
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟