امیر حسین
4 سال پیش توسط امیر حسین مطرح شد
1 پاسخ

ارسال نشدن Session در node js

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

من یک مشکل در بخش سشن ها دارم که میخوام با دستور req.session.example مقداری رو در سشن ذخیره میکنم و در جای دیگری بهش دسترسی داشت باشم

من برای اینکه بررسی کنم که کاربر وارد شده به حساب هست یا نه یک مقدار token رو در سشن req.session.token ذخیره میکنم، حالا توی یک از روت هام میخوام بررسی کنم که اگر این سشن تنظیم شده به کاربر اجازه ورود به اون روت رو بده و در غیر این صورت یک ارور بهش نمایش بده که ابتدا وارد حساب شوید

این موضوع روی لوکال مشکلی نداره و بعد از وارد شدن به حساب از طریق صفحه ورود و بعد صدا زدن اون روت بدون مشکل وارد روت میشم ولی وقتی میرم روی سرور آنلاین به مشکل میخورم و سشن رو پیدا نمیکنه در نتیجه اجازه ورود به اون روت رو نمیده و ارور ابتدا وارد حساب شوید رو نمایش میده!! تو نت سرچ زدم و به req.session.save() رسیدم و تست کردم ولی نتیجه تغییری نکرد و همچنان به من اجازه وارد شدن به اون روت رو نمیده! وقتی هم که میگم req.session.token رو چاپ کنه نتیجه ای نداره و مقدار خالی رو چاپ میکنه

اگر تاثیری در جواب داره سرور آنلاینم گواهی SSL نداره و به واسطه HTTP لود و کار میکنه نه HTTPS (هرچند که تمامی بخش ها بدون مشکل کار میکنند و تنها مشکل موجود مورد اشاره شده است)

@ali.bayat @hesammousavi @mhyeganeh

کد تنظیمات express-session در فایل app.js

// create and save session in DB
let sess = {
    store: new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl: 24 * 60 * 60 // session expiration = 1 day
    }),
    resave: false,
    saveUninitialized: true,
    secret: config.sessSalt,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24
    }
}

if (app.get('env') === 'production') {
    app.set('trust proxy', 1) // trust first proxy
    sess.cookie.secure = true // serve secure cookies
}

app.use(session(sess))

کد ذخیره سازی session در روت post ورود

if (!status) {
                        return res.status(422).json({
                            massage: 'رمز عبور اشتباه است',
                            password: false,
                            success: false
                        });
                    } else {
                        // get user basic info from user transfer
                        let userData = new UserTransform().transform(result, true);

                        // save user api token in a session
                        req.session.token = userData.token;
                        req.session.save()

                        // return user's basic information
                        return res.json({
                            massage: 'شما با موفقیت وارد شدید',
                            data: userData,
                            session: req.session,
                            success: true
                        });
                    }

کد درخواست بررسی وجود session

let token = req.session.token ;

if (token) {
...
}

return res.status(422).json('ابتدا وارد حساب کاربری شوید')

درخواست چاپ req.session.tokrn و req.session

return res.json({
        massage: token,
        session: req.session,
        success: true
    })

نتیجه چاپ شده

{
        "session":{"cookie":{"originalMaxAge":86400000,"expires":"2021-02-15T09:34:25.658Z","secure":true,"httpOnly":true,"path":"/"}},
        "success":true
    }

ممنون میشم راهنمایی بفرماید


ثبت پرسش جدید
امیر حسین
@Khateri.AmirHossein 4 سال پیش مطرح شد
0

مشکل حل شد

مشکل به علت استفاده همزمان از کوکی و سشن بود برای رفع مشکل باید بخش های مربوط به کوکی از کد تنظیمات express-session در فایل app.js حذف می‌شدند

کد نهایی تنظیمات

// create and save session in DB
const sess = {
    store: new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl: 24 * 60 * 60 // session expiration = 1 day
    }),
    secret: config.sessSalt,
    resave: false,
    saveUninitialized: false
}

if (app.get('env') === 'production') {
    app.set('trust proxy', 1) // trust first proxy
}

app.use(session(sess))

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

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