x
2 سال پیش توسط x مطرح شد
6 پاسخ

خارج کردن کاربر از حساب کاربری با استفاده از socket.io

سلام خسته نباشید

من یه قابلیتی رو به اپم اضافه کردم که اکانت کاربر رو بصورت موقت غیرفعال میکنه
حالا میخوام با استفاده از socket کاربری که غیرفعال میشه رو لاگ اوت کنه

من کدی رو سمت سرور نوشتم و به درستی داره کار میکنه فقط نکته ای که وجود داره زمانی که من کاربر رو دی اکتیو میکنم
از سمت ادمین خارج میشه ولی سمت یوزر همچنان کانکت میمونه

و سوالی که برای من پیش اومده اینه که من اطلاعات مربوط به لاگین و کوکی ها رو در مرورگر کاربر ذخیره میکنم آیا این امکان وجود داره که من بتونم از سمت سرور کوکی های کاربر رو حذف کنم
و با این کد مطمئنا نمیتونم کاربر رو لاگ اوت کنم

ممنون میشم کسی بتونه کمکم کنه این مشکلمو برطرف کنم


ثبت پرسش جدید
میکائیل
تخصص : برنامه نویسی سمت سرور و کلاینت
@FullStack 2 سال پیش آپدیت شد
1

سلام وقت بخیر
برای این کار شما باید وقتی روت 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;
});

x
تخصص : هیچولوژیست
@SZaaaa1111 2 سال پیش مطرح شد
0

@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]);

میکائیل
تخصص : برنامه نویسی سمت سرور و کلاینت
@FullStack 2 سال پیش آپدیت شد
1

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


x
تخصص : هیچولوژیست
@SZaaaa1111 2 سال پیش مطرح شد
0

@FullStack
سمت کاربر هیچ عکس العملی نشون نمیده
ولی سمت ادمین که این کد اجرا میشه خود ادمین میره به صفحه logout...


میکائیل
تخصص : برنامه نویسی سمت سرور و کلاینت
@FullStack 2 سال پیش مطرح شد
1

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


x
تخصص : هیچولوژیست
@SZaaaa1111 2 سال پیش آپدیت شد
1

@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);

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام