• 0

ظهور الخطأ failed to serialize user into session في node.js

أقوم باستخدام حزمة التوثيق passport.js في خادم node.js، والكود لدي بهذا الشكل:

'use strict';

var express = require('express');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

var app = express();

module.exports = function setupServer(){

app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'secretKeyHere' }));
app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy(function(username, password, result) {
  if (username === 'test' && password === 'test') {
    console.log('Success');
    result(null, {username});
  } else {
    result(null, false);
  }
}));

app.post('/login', passport.authenticate('local', {
  successRedirect: '/loggedIn',
  failureRedirect: '/guest'
}));


app.listen(5000);
console.log('Server listening on port 5000');

}();

ولكن يظهر لي الخطأ التالي دوماً:

Error: failed to serialize user into session

كيف يمكنني تجاوز هذا الخطأ؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

لقد نسيت الشيفرة التي تعمل في المنتصف عند المصادقة 

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(user, done) {
  done(null, user);
});

يستخدم Passport وظيفة serializeUser للاحتفاظ ببيانات المستخدم (بعد المصادقة الناجحة) في session. يتم استخدام وظيفة deserializeUser لاسترداد بيانات المستخدم من session.

تتحقق كلتا الدالتين serializeUser و deserializeUser من الوسيطة الأولى التي تم تمريرها إليهما ، وإذا كانت من نوع دالة ، فإن serializeUser و deserializeUser لن تفعلا أي شئ  ولكن يتم وضع الدالة في كومة من الوظائف  والتي سيتم استدعاؤها بعد ذلك .

عندما يتم تمرير الوسيطات الأولى ليست من النوع وظيفة يحتاج Passport إلى الإعداد التالي لحفظ بيانات المستخدم بعد المصادقة في session:

app.use(express.session({ secret: 'secretKeyHere' }));
app.use(passport.initialize());
app.use(passport.session());

لذا فكل الشيفرات مترابطة مع بعضها غياب احدها سيؤدي لفشل كامل

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

من خلال ترجمة الخطأ يبدو أنك نسيت إضافة الدالة serializeUser و deserializeUser كالتالي

assport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

كما يظهر في التوثيق الخاص بالمكتبة من هنا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

لقد قمت بنسيان اضافة كل من passport.serializeUser & passport.deserializeUser

كل ما عليك فعله هو اضافتها 

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

 

تمّ تعديل بواسطة MoJaffer

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن