اذهب إلى المحتوى
  • 0

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

Tamim Fahed

السؤال

أقوم باستخدام حزمة التوثيق 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

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

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

Recommended Posts

  • 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
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...