سلام خسته نباشید
من یه قابلیتی رو به اپم اضافه کردم که اکانت کاربر رو بصورت موقت غیرفعال میکنه
حالا میخوام با استفاده از socket کاربری که غیرفعال میشه رو لاگ اوت کنه
من کدی رو سمت سرور نوشتم و به درستی داره کار میکنه فقط نکته ای که وجود داره زمانی که من کاربر رو دی اکتیو میکنم
از سمت ادمین خارج میشه ولی سمت یوزر همچنان کانکت میمونه
و سوالی که برای من پیش اومده اینه که من اطلاعات مربوط به لاگین و کوکی ها رو در مرورگر کاربر ذخیره میکنم آیا این امکان وجود داره که من بتونم از سمت سرور کوکی های کاربر رو حذف کنم
و با این کد مطمئنا نمیتونم کاربر رو لاگ اوت کنم
ممنون میشم کسی بتونه کمکم کنه این مشکلمو برطرف کنم
سلام وقت بخیر
برای این کار شما باید وقتی روت logout رو صدا میزنی کوکی ها پاک بشه و باید از کلید کوکی که برای ورود استفاده کردی استفاده کنی و clear کنی با کد زیر
res.clearCookie("key");
res.end()
میتونید استفاده کنید و برای حذف session باید کد زیر رو استفاده کنید
app.get('/logout', function(req, res) {
req.session.destroy(function(err) {
if(err) {
console.log(err);
} else {
res.redirect('/');
}
});
});
و این کد هم در app برنامه استفاده کن
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
وقتی emit کردی سمت سوکت بگو به ادرس logout/ ریداریکت کنه و اونجا بگو کوکی ها و سشن ها پاک بشن و به سمت روت لاگین ریدایرکت کنه
سمت کلایت که emit کنی به سرور
io.on('connection', function(socket) {
socket.on('logout', function() {
socket.emit('redirect', '/logout');
});
});
و سمت سرور که گوش میده
socket.on('redirect', function(url) {
window.location.href = url;
});
@FullStack
خیلی ممنونم از شما
منم تقریبا به همین صورت انجام دادم ولی برای کاربر خارج نمیشه
session تو فایل app.js بک اند
app.use(expressSession({
name: 'myCookie',
secret: 'secretkey',
resave: false,
saveUninitialized: true
}));
من به این صورت تو کنترلر مربوط به لاگ اوت کوکی رو حذف میکنم
logout: async (req, res) => {
try {
res.clearCookie("myCookie", "refreshtoken", { path: "/refresh_token" });
return res.json({ msg: "Logged out." });
} catch (err) {
return res.status(500).json({ msg: err.message });
}
},
ولی این روش من فقط برای کسی که خودش میخواد لاگ اوت شه خوب عمل میکنه و زمانی که من تو ساکت میخوام از این ریدایرکت استفاده کنم برای کاربر هیچ عملی انجام نمیگیره حتی بعد از رفرش صفحه کاربر بازم توکن رو تو کوکی هاش داره
ساکت سرور
socket.on('logout', function() {
socket.emit('redirect', '/logout');
});
ساکت کلاینت
useEffect(() => {
socket.on('redirect', (url) => {
window.location.href = url;
});
}, [socket]);
شما وقتی توی کنترل پنل ادمین لاگ اون میزنید واکنشی توی صفحه کاربر معمولی میبینید؟ که ریدایرکت بشه یا هرچی؟ چون اگر حتی ریدایرکت هم نشه یعنی شما توی سوکت مشکل داری و وقتی میزنی emit رو دریافت نمیکنه سعی کن یه سری تست انجام بدی اول یه سری emit تستی بکن از سمت پنل ببین کاربر اصن ریدایرکت میشه یا نه فعلا نمیخواد لاگ اوت کنی فقط ببین ریدایرکت میشه اگه شد یعنی کدت درسته اگه نه یعنی emit اصلا دریافت نمیشه
@FullStack
سمت کاربر هیچ عکس العملی نشون نمیده
ولی سمت ادمین که این کد اجرا میشه خود ادمین میره به صفحه logout...
خوب پس مشکل پیدا شد از سوکت هست والا منکه نمیدونم چجوری پیاده سازیش کردی ولی ببین میتونی ارتباط سوکت بین ادمین و کاربر رو برقرار کنی اگه برقرار شد اون موقعه لاگ اوت کردن خیلی اسون میشه
@FullStack
خیلی ممنونم ازت، حل شد
بله دقیقا مشکل من از ساکت بود به این صورت ارتباط بین ادمین و کاربر رو درست کردم
ساکت بک اند
socket.on('pick', (ucli) => {
const clients = users.filter((user) => ucli.includes(user.id));
clients.forEach((client) => {
socket.to(`${client.socketId}`).emit('pick', '/logout', ucli);
});
console.log(clients);
});
فرانت
socket.emit("pick", user._id);
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟