درود استاد وقتتون بخیر باشه
ی موردی که من جدیدا بهش برخوردم و خیلی خیلی فورسه اینکه من پروژه هام تازه شروع به استفاده کردن توی کشور های دیگه شده و ی باگ خیلی خیلی بدی پیش اومده و باگشم اینه :
import axios from "axios";
import crypto from "crypto";
import { errorTost } from "../utils/toast/reactTostify";
class Api {
constructor() {
this.axios = axios.create({
baseURL: process.env.URL_API,
});
this.axios.defaults.headers.common["Accept"] = "application/json";
this.axios.defaults.headers.post["Content-Type"] = "application/json";
this.axios.interceptors.request.use((config) => {
if (config.method === "post" && config.data) {
// اضافه کردن نانس و تایماستمپ به درخواست
config.headers["Authorization"] = this.encryptData(process.env.API_TOKEN);
// رمزگذاری دادهها قبل از ارسال
config.data = this.encryptData(config.data);
}
return config;
});
this.axios.interceptors.response.use(
(response) => {
if (response.data && response.data.encryptedData) {
response.data = this.decryptData(response.data);
}
return response;
},
(error) => {
// در اینجا ارور را مدیریت میکنیم
errorTost("خطا در ارتباط با سرور ، صفحه مجددا رفرش میشود");
// بررسی وضعیت تب مرورگر
if (document.visibilityState === "visible") {
setTimeout(() => {
window.location.reload();
}, 4000);
}
return Promise.reject(error);
}
);
}
// تابع برای ایجاد نانس منحصر به فرد
generateNonce() {
return Math.random().toString(36).substr(2, 9); // نانس تصادفی 9 رقمی
}
// رمزگذاری دادهها (پیش از ارسال به API)
encryptData(data) {
const passphrase = process.env.API_TOKEN_PASSPHRASE;
const iv = crypto.randomBytes(12);
const cipher = crypto.createCipheriv("aes-256-gcm", Buffer.from(passphrase, "utf-8"), iv);
const expirationTime = Date.now();
const dataWithExpiration = {
...data,
exp: expirationTime,
};
let encrypted = cipher.update(JSON.stringify(dataWithExpiration), "utf-8", "hex");
encrypted += cipher.final("hex");
const authTag = cipher.getAuthTag().toString("hex");
return {
iv: iv.toString("hex"),
authTag,
encryptedData: encrypted,
};
}
// رمزگشایی دادهها (پس از دریافت از API)
decryptData(encryptedData) {
const { iv, authTag, encryptedData: data } = encryptedData;
const passphrase = process.env.API_TOKEN_PASSPHRASE;
const decipher = crypto.createDecipheriv("aes-256-gcm", Buffer.from(passphrase, "utf-8"), Buffer.from(iv, "hex"));
decipher.setAuthTag(Buffer.from(authTag, "hex"));
let decrypted = decipher.update(data, "hex", "utf-8");
decrypted += decipher.final("utf-8");
const parsedData = JSON.parse(decrypted);
return parsedData;
}
اگه دقت کنید من میام دیتاهارو رمز گزاری میکنم و ارسال میکنم و توی این مورد مشکلی ندارم
مشکلی که هست مربوط به تایم دیتاهاست من میام با متغیرexp زمان فعلی که date.now هست رو همراه دیتاها ارسال میکنم و سمت بک اندم هم مجدد همین کارو میکنم و زمان حال رو میگیرم و اگر زمان ارسال حداکثر تا 5 ثانیه کوچیک تر از زمان فعلی بودن میزارم پردازش بشه ولی اگه توی بازه ی زمانی این مقدار نبود امکان پردازش رو نمیدم
یعنی ی جورایی واسه هر داده 5 ثانیه زمان منقضی شدن میدم
این کامل اوکیه تا وقتی که زمان Date.now() روی مرورگر کاربر با زمان سرور من تفاوت داره و من حداکثر 1 تایم زمانی میتونم روی سرورم تنظیم کنم
یعنی اگه کاربر داخل ایران زمانش x باشه و سرور من هم ساعتش روی ایران تنظیم شده باشه زمان x رو برمیگردونه
کاربر خارج زمانش x + n هست و همین باعث میشه هیچ وقت دیتاش پردازش نشه !
من اومدم کد زدم که زمان رو از ی api از سرورم بگیره که برای همه یکسان باشه ولی اینکار باعث شده تعداد درخواست ها چند برابر بشه به سرورم و اصلا ایده جالبی نبود ، جدا از اینکه بعضی اوقات هم این مشکل حل نمیشد بدلیل سرعت پردازش ها یا سرعت نت کاربر توی ایران
برای همین الان راه حل چیست ؟ پکیچی واسه اینکار وجود داره که من نخام اینارو خودم دستی هندل کنم و خود پکیجه ی زمانی واسه خود دیتاش داشته باشه؟
ممنون
وقت بخیر دوست عزیز.
من همین متن خودتون رو در چت جی پی تی زدم و فکر میکنم راه حل های خوبی ارايه داده.
لینک صفحه چت
سلام دوست من
راهکارهایی که پیشنهاد شده رو چک کن اگه مشکلت حل نشد بگو تا بیشتر بررسی کنیم
درود
ممنون از راهنماییتون
ار راهکار دوستمون استفاده کردم البته با کمی تغییرات بیشتر و یکمی پیچ و تابش دادم
https://uploadkon.ir/uploads/7b5914_2520250414-095236.mp4
این ویدئو رو نگاه کنید و اگر مشکلی بود بهم بگین